在做项目过程中需要使用Assimp这个3D模型读取库来读取obj格式的模型,因为项目是基于Android平台,采用NDK开发,所以就打算编译Assimp库并生成.so文件。本文使用Assimp-v.5.0.0.rc1(https://github.com/assimp/assimp/releases/tag/v.5.0.0.rc1),此版本已经支持在导入FBX的同时导入blendshape。网上的资料大多比较老,针对assimp-3.3的比较多,新版本的编译还是有些不同,特记录下。

首先我们看下Assimp中blenshape导入的代码:以FBX为例 在FBXConverter.cpp中,也就是说blendshape以顶点动画的形式 保存在了aiAnimMesh这个数据结构中,后续对bs的操作只需要操作对应的aiAnimMesh即可。

/** @brief An AnimMesh is an attachment to an #aiMesh stores per-vertex

* animations for a particular frame.

std::vector animMeshes;

for (const BlendShape* blendShape : mesh.GetBlendShapes()) {

for (const BlendShapeChannel* blendShapeChannel : blendShape->BlendShapeChannels()) {

const std::vector& shapeGeometries = blendShapeChannel->GetShapeGeometries();

for (size_t i = 0; i < shapeGeometries.size(); i++) {

aiAnimMesh *animMesh = aiCreateAnimMesh(out_mesh);

const ShapeGeometry* shapeGeometry = shapeGeometries.at(i);

const std::vector& vertices = shapeGeometry->GetVertices();

const std::vector& normals = shapeGeometry->GetNormals();

const std::vector& indices = shapeGeometry->GetIndices();

animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name()));

for (size_t j = 0; j < indices.size(); j++) {

unsigned int index = indices.at(j);

aiVector3D vertex = vertices.at(j);

aiVector3D normal = normals.at(j);

unsigned int count = 0;

const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count);

for (unsigned int k = 0; k < count; k++) {

unsigned int index = outIndices[k];

animMesh->mVertices[index] += vertex;

if (animMesh->mNormals != nullptr) {

animMesh->mNormals[index] += normal;

animMesh->mNormals[index].NormalizeSafe();

}

}

}

animMesh->mWeight = shapeGeometries.size() > 1 ? blendShapeChannel->DeformPercent() / 100.0f : 1.0f;

animMeshes.push_back(animMesh);

}

}

}

const size_t numAnimMeshes = animMeshes.size();

if (numAnimMeshes > 0) {

out_mesh->mNumAnimMeshes = static_cast(numAnimMeshes);

out_mesh->mAnimMeshes = new aiAnimMesh*[numAnimMeshes];

for (size_t i = 0; i < numAnimMeshes; i++) {

out_mesh->mAnimMeshes[i] = animMeshes.at(i);

}

}

return static_cast(meshes.size() - 1);

}

下面正式开始编译

下载Android Studio(主要是利用其带的SDK以及CMAKE)下载并安装Python,注意安装过程中需要勾选添加到环境变量,我安装的是Python3.5,可通过命令行键入python检查Python是否已经配置好:

下载并解压Assimp-v.5.0.0.rc1

在NDK目录下的build/tools下,通过以下命令生成编译时所需要的交叉编译ToolChain,注意:

.make_standalone_toolchain.py --arch=arm --stl=gnustl --api=9 --install-dir=toolchain-9-arm-gnustl

--arch 参数指定不同的架构:arm64-v8a对应arm64,armeabi-v7a对应arm等等。

--stl指定使用哪种stl,本文使用gnustl

--api 本文选择了9

将生成的toolchain-9-arm-gnustl整个文件夹复制到Assimp-v.5.0.0.rc1的同级目录下。

在Assimp-v.5.0.0.rc1的同级目录下,新建一个build_assimp.bat,用于编译生成.so文件,文件内容如下:

1. @echo off2. cls3.4. REM *NOTE*Change these based on5. SET ASSIMP_DIR=assimp-v.5.0.0.rc16. SET OUTPUT_DIR=aassimp-build-armeabi-v7a7. SET ANDROID_PATH=C:/Users/xxxx/AppData/Local/Android/Sdk8. SET NDK_PATH=G:/software/android-ndk-r16b9. SET NDK_TOOLCHAIN=%~dp0toolchain-9-arm-gnustl10. SET CMAKE_TOOLCHAIN=%NDK_PATH%/build/cmake/android.toolchain.cmake11. SET CMAKE_PATH=%ANDROID_PATH%/cmake/3.6.4111459

12.13. REM *NOTE* Careful if you don't want rm -rf, I use it for testing purposes.

14.15. mkdir %OUTPUT_DIR%

16.17. REM pushd doesn't seem to work ):<

18. cd %OUTPUT_DIR%

19.20. if not defined ORIGPATH set ORIGPATH=%PATH%

21. SET PATH=%CMAKE_PATH%\bin;%ANDROID_PATH%\tools;%ANDROID_PATH%\platform-tools;%ORIGPATH%

22.23. cmake ^

24. -GNinja ^

25. -DCMAKE_TOOLCHAIN_FILE=%CMAKE_TOOLCHAIN% ^

26. -DASSIMP_ANDROID_JNIIOSYSTEM=ON ^

27. -DANDROID_NDK=%NDK_PATH% ^

28. -DCMAKE_MAKE_PROGRAM=%CMAKE_PATH%\bin\ninja.exe ^

29. -DCMAKE_BUILD_TYPE=Release ^

30. -DANDROID_ABI="armeabi-v7a" ^

31. -DANDROID_NATIVE_API_LEVEL=9 ^

32. -DANDROID_FORCE_ARM_BUILD=TRUE ^

33. -DCMAKE_INSTALL_PREFIX=install ^

34. -DANDROID_STL=gnustl_static ^

35. -DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing ^

36. -DANDROID_TOOLCHAIN=clang ^

37.38. -DASSIMP_BUILD_TESTS=OFF ^

39.40. ../%ASSIMP_DIR%

41.42. cmake --build .43.

8.参数解释:

ASSIMP_DIR是解压的Assimp库所在的文件夹

OUTPUT_DIR是保存编译生成文件的文件夹

ANDROID_PATH跟NDK_PATH需要修改为自己机器上的路径

NDK_TOOLCHAIN是保存工具链的文件夹

下面的-DANDROID_ABI和-DANDROID_NATIVE_API_LEVEL参数需要改成所需的值。

DANDROID_STL=gnustl_static ^  ,需要与之前生成工具链选择的c库一致。

然后双击运行.bat文件,如果没有报错,就能在< OUTPUT_DIR>/code/下找到libassimp.so文件,想要生成其他架构下的.so文件,只需修改生成toolchain和.bat文件参数(-DANDROID_ABI="armeabi-v7a" ^ ),再执行即可。

如果想生成静态库.a,需要打开assimp/CMakeList.txt,将BUILD_SHARED_LIBS关掉,并增加下面三行,然后重复上面步骤。

Assimp定制化:

assimp功能强大,可以加载和导出多种3D模型,附加多种效果优化功能,但在需求中有很多功能使用不到,所以可以在编译时直接剔除已达到减小静态库的目的,需要注意的是:除了需要在编译时通过宏控制编译之外还需要直接在code/CMakeLists.txt文件中将相应的源码注释掉。【后续详细补充】

原文出处:https://www.cnblogs.com/chenc-c/p/10737082.html

来源:oschina

链接:https://my.oschina.net/u/4396307/blog/3265784

assimp android build,Windows环境下编译Assimp库生成Android可用的.so或.a文件相关推荐

  1. Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法

    环境准备 Windows7/10电脑需要能访问https://skia.org/和https://skia.googlesource.com/skia.git 在Windows上安装Visual St ...

  2. 在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法

    在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法 1 致谢和参考文章 1.1 致谢 1.2 参考文章 2 环境介绍 3 整体思路 4 ...

  3. Android笔记——Windows环境下Android Studio v1.0安装教程

    本文主要讲解Windows环境下Android Studio的安装教程,Mac的Android Studio安装与此类似不在赘述,另外友情提示Windows下的SDK与Mac的SDK是通用的,可以直接 ...

  4. 四种环境下编译nanomsg库

    VS2013编译生成nanomsg库文件 因为工作中用到了nanomsg,又需要编译成库来使用,发现网上资料很少,所以做此记录. 编译准备,CMake工具软件和下载好的nanomsg源码包.我的是CM ...

  5. android源码环境下编译fourthling.cling库的依赖问题

    记录下,编译fourthline.cling静态库的依赖问题. 1,因为需要在android的源码环境下调试依赖cling的投屏,需要将fourthline.cling编译为静态库. 首先预制依赖的. ...

  6. 在Windows环境下编译VPX

    首先到CygWin的官网下载CygWin的安装包,编译环境需在此环境下进行,https://cygwin.com/install.html,安装的过程中,记得一定要安装perl,make,wget,a ...

  7. Windows环境下编译Airsim

    AirSim是微软基于UE4(后来也添加了Unity工程)开发的一款开源模拟器,可以模拟无人机.无人车.源码地址: https://github.com/Microsoft/AirSim 下面简单说下 ...

  8. 在Windows环境下使用与Linux/Unix操作相关的C/C++头文件的方法(以TDM-GCC和CLion为例)

    前言 很多时候我们需要在Windows环境中写与Linux/Unix相关的C/C++代码,而Linux/Unix相关的头文件在Windows中是缺失的,这就导致IDE的文本纠错等功能无法正常使用带来很 ...

  9. 在Windows环境下编译cocos2d-x-3.0

    1. 安装配置开发环境 1.1 安装JDK 1) 下载并安装jdk-7u7-windows-i586.exe     2) 设置[JAVA_HOME]为"C:\Program Files\J ...

  10. Windows环境下编译FreeRDP

    关于在Linux下如何编译FreeRDP,在github的wiki上面已经说的很明白了,而且相当简单,具体细节参考网址:FreeRDP构建说明.大抵就是make,make install之类的,并且之 ...

最新文章

  1. Transform-style和Perspective属性
  2. 预告|开源操作系统年度技术会议
  3. 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
  4. win8/8.1 免密码登录设置
  5. Github 简明教程
  6. get post请求区别_LoadRunner发送GET和POST请求
  7. 关于决策树,你一定要知道的知识点!(文末送书)
  8. CSDN博客代码块代码没有高亮颜色解决办法
  9. ARM汇编指令:LDR伪指令和LDR装载指令的区别
  10. ​炸裂!万字长文拿下 HTTP 我在字节跳动等你!
  11. Linux 网络编程 —— 套接字的介绍
  12. 在Mac上将WebP图像批量转换为JPG的方法
  13. 软件测试 -- 单元测试,集成测试,系统测试的侧重点
  14. NOIP2017总结
  15. 威纶通触摸屏部分元件下载后不显示且编辑时无法选择
  16. PLC编程器的功能有什么功能?
  17. SQL数据库练习题以及答案(46例题)
  18. beetl模板使用场景_Beetl使用指南
  19. linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记
  20. OSChina 周六乱弹 ——什么是村支书不可推卸的责任!

热门文章

  1. 前端开发——浏览器插件推荐
  2. 伟大程序员必须具备的7个好习惯
  3. 静态网页连接mysql数据库_静态网页可以联接sql数据库吗?代码怎么写?
  4. 步进驱动系统:步进电机与步进驱动器控制原理简述
  5. Latex:目录和标题
  6. matlab怎么输出坐标轴,怎样将matlab图像里面的x,y坐标轴的数据输出
  7. 华为云C6系列服务器,真实评价华为云c6s和c6怎么样-配置区别不大
  8. linux 主机支持远程唤醒_在Linux下用Wake On LAN实现远程开机
  9. Linux下使用和配置magick
  10. 通过ip查看主机名和端口占用情况