大家好,接下来将为大家介绍模型加载库 Assimp 。

1、Assimp介绍

Assimp 全称为 Open Asset Import Library,可以支持几十种不同格式的模型文件的解析(同样也可以导出部分模型格式),Assimp 本身是 C++ 库,可以跨平台使用。

Assimp 可以将几十种模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型数据。

当导入一个模型文件时,即Assimp加载一整个包含所有模型和场景数据的模型文件到一个scene对象时,Assimp会为这个模型文件中的所有场景节点、模型节点都生成一个具有对应关系的数据结构,且将这些场景中的各种元素与模型数据对应起来。下图展示了一个简化的Assimp生成的模型文件数据结构:

a、所有的模型、场景数据都包含在scene对象中,如所有的材质和Mesh。同样,场景的根节点引用也包含在这个scene对象中。

b、场景的根节点可能也会包含很多子节点和一个指向保存模型点云数据mMeshes[]的索引集合。根节点上的mMeshes[]里保存了实际了Mesh对象,而每个子节点上的mMesshes[]都只是指向根节点中的mMeshes[]的一个引用。

c、一个Mesh对象本身包含渲染所需的所有相关数据,比如顶点位置、法线向量、纹理坐标、面片及物体的材质。

d、一个Mesh会包含多个面片。一个Face(面片)表示渲染中的一个最基本的形状单位,即图元(基本图元有点、线、三角面片、矩形面片)。一个面片记录了一个图元的顶点索引,通过这个索引,可以在mMeshes[]中寻找到对应的顶点位置数据。顶点数据和索引分开存放,可以便于我们使用缓存(VBO、NBO、TBO、IBO)来高速渲染物体。

e、一个Mesh还会包含一个Material(材质)对象用于指定物体的一些材质属性。如颜色、纹理贴图(漫反射贴图、高光贴图等)。

所以我们要做的第一件事,就是加载一个模型文件为scene对象,然后获取每个节点对应的Mesh对象(我们需要递归搜索每个节点的子节点来获取所有的节点),并处理每个Mesh对象对应的顶点数据、索引以及它的材质属性。最终我们得到一个只包含我们需要的数据的Mesh集合。

2、构建Assimp

Assimp 源代码地址:https://github.com/assimp/assimp

a:设置的几个环境变量如下:

export ANDROID_NDK_PATH=/Users/liao/Library/Android/sdk/ndk-bundle // 设置DNK路径
export ANDROID_SDK_PATH=/Users/liao/Library/Android/sdk // 设置SDK路径
export CMAKE_TOOLCHAIN=/Users/liao/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake // 设置交叉编译用到的toolchain,这个用NDK默认提供的就行
export ANDROID_NDK_TOOLCHAIN=/Users/liao/Library/Android/sdk/android-toolchain // 这个也必须设置,其中android-toolchain就是上面生成的啦
export PATH=$PATH:/Users/liao/Library/Android/sdk/android-toolchain/bin // 必须设置

b:设置了环境变量之后,我们就可以通过cmake生成makefile了。

首先执行下面的命令:

cd xxx/assimp // 下载assimp,然后解压,进入assimp根目录
mkdir buildAndroid // 创建文件夹
cd buildAndroid // 进入这个文件夹

然后执行下面的命令

cmake -DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN -DCMAKE_INSTALL_PREFIX=/assimp -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=android-14 -DANDROID_FORCE_ARM_BUILD=TRUE -DANDROID_STL=c++_shared -DASSIMP_BUILD_OBJ_IMPORTER=TRUE -DASSIMP_BUILD_FBX_IMPORTER=TRUE -DANDROID_NDK=$ANDROID_NDK_PATH -DCMAKE_BUILD_TYPE=Release -DANDROID_FORCE_ARM_BUILD=TRUE -DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing -DANDROID_TOOLCHAIN=clang -DASSIMP_BUILD_TESTS=OFF -DASSIMP_NO_EXPORT=TRUE -DASSIMP_BUILD_ASSIMP_TOOLS=FALSE -DASSIMP_BUILD_SAMPLES=FALSE -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=FALSE ..

参数解释

-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN 指向上面生成的toolchain
-DCMAKE_INSTALL_PREFIX=/assimp 最终生成的.so文件的名称
-DANDROID_ABI=armeabi-v7a 应用程序二进制接口类型,详见[ABI Management](https://developer.android.com/ndk/guides/abis)
-DANDROID_NATIVE_API_LEVEL=android-14 api版本,设成这个就行
-DANDROID_FORCE_ARM_BUILD=TRUE 强制编译arm架构
-DANDROID_STL=c++_shared c++类型
-DASSIMP_BUILD_OBJ_IMPORTER=TRUE 支持OBJ格式的3D模型文件导入
-DASSIMP_BUILD_FBX_IMPORTER=TRUE 支持FBX格式的3D模型文件导入
-DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=FALSE assimp默认支持很多种3D模型格式,这里只指定常用的一两种格式即可,减小.so包的大小
-DASSIMP_BUILD_TESTS=OFF 这个要关掉,不然make时会有一些奇怪的错误
-DASSIMP_NO_EXPORT=TRUE 只需要解析3D模型,不需要生成3D模型

c:上面的步骤生成了makefile文件,下面进行make批处理。

make -j8 // 在buildAndroid目录下执行make操作。其中-j8是指多线程个数,根据自己电脑配置,选择不同线程数,线程数越多编译的越快。

上面make如果没出错的话,直接去assimp/buildAndroid/code目录下寻找libassimp.so文件。

模型加载库 Assimp相关推荐

  1. OpenGL Assimp模型加载库

    OpenGL Assimp库 前言 模型加载库 构建Assimp 前言 到目前为止的所有场景中,我们一直都在滥用我们的箱子朋友,但时间久了甚至是我们最好的朋友也会感到无聊.在日常的图形程序中,通常都会 ...

  2. 用Assimp模型加载库加载一个Crytek的游戏孤岛危机(Crysis)中的原版纳米装(Nanosuit)

    用这个例子来对GitHub上的LearnOpenGL教程前四个单元用到的所有自定义或者引入的各种头文件和资源进行一个总结,不得不说这个教程简直太美妙了. 这个模型是来自对GitHub上的LearnOp ...

  3. QT+OpenGL模型加载 - Assimp

    QT+OpenGL模型加载 - Assimp 本篇完整工程见gitee:OpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主 模型加载 先来张图: 我们不大可能手 ...

  4. OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

    写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解.但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很 ...

  5. Android OpenGLES2.0(十四)——Obj格式3D模型加载

    转自:http://blog.csdn.net/junzia/article/details/54300202 在博主<OpenGLES系列>文章中,最开始的几篇讲的就是OpenGL世界中 ...

  6. 如何将深度学习模型加载到android环境中

    承接上一篇的内容,考虑如何将深度学习的模型加载到android app中 文章目录 前言 一.使用工具 二.使用步骤 1.模型格式的转换 2.配置文件修改 3. 应用程序 前言 将图片学习的模型加载到 ...

  7. OpenGL模型加载之模型

    参考: https://learnopenglcn.github.io/03%20Model%20Loading/03%20Model/ 定义一个模型类 class Model {public:/* ...

  8. three.js DRACOLoader glb模型加载错误 three Unexpected token < in JSON at position 0

    前言 所采用的three库版本为 ^0.138.2 本文所记录的是笔者在使用pacel-web打包工具学习three.js时遇到的一个模型加载问题,在导入模型的时候浏览器识别不出模型文件(以.glb为 ...

  9. FaceBook推出的Android图片加载库-Fresco

    源文件:http://www.mamicode.com/info-detail-544084.html 在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像 ...

最新文章

  1. seaborn系列 (15) | 双变量关系图jointplot()
  2. 【机器学习】UMAP:强大的可视化降维工具
  3. 请说明一下web.xml文件中可以配置哪些内容?
  4. 软件项目组织管理(一)项目管理概述
  5. ios多线程 -- NSOperation 简介
  6. wex5中win8或者win10操作系统studio中新建.w向导或其他的编辑窗口显示不全
  7. hadoop-2.7.2 分布式集群搭建
  8. 深度探索Win32可执行文件格式
  9. html5游戏制作入门系列教程(八)
  10. C/C++——cmd下丢失mspdb100.DLL解决方法
  11. 类、匿名类、静态、构造、单例
  12. jmeter压力测试的辅助插件和实操技巧
  13. 质谱流式细胞技术 小笔记
  14. Git 基础知识 - 查看提交历史记录
  15. 求一阶微分方程通解和特解
  16. 民数记研读3——于宏洁
  17. SpringCloud及SpringCloudAlibaba微服务组件
  18. Python将PDF转成图片—PyMuPDF和pdf2image
  19. PostgreSQL - 学习/实践
  20. 一个进度条,类似DNF的血条

热门文章

  1. 流利阅读 2019.3.11 Going TikTok—Indians get hooked on Chinese video app ahead of election
  2. 全球首次,我国科学家攻克世界级难题,证实量子金属态存在
  3. Stream流(工厂的流水线)
  4. 初来乍到,多多指教!
  5. 户外电源连接解决方案——同为(TOWE)五孔明装工业防水插座
  6. Python(九)类和对象
  7. 课工场 “微服私访”项目学习(六)
  8. 微分方程4_傅里叶级数
  9. 三相异步电机检测技术的应用研究
  10. 游戏场景构成研究:图形构成