当前位置: 首页 > news >正文

【小沐学CAD】开源Assimp库导入三维模型(C++、Python)

文章目录

  • 1、简介
  • 2、下载编译
  • 3、代码测试
    • 3.1 C++
    • 3.2 pyassimp(Python)
  • 结语

1、简介

https://github.com/assimp/assimp

Open Asset Import Library 是一个库,用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和越来越多的用于导出的文件格式选择。

在这里插入图片描述

一个非常流行的模型导入库是Assimp,它是Open Asset Import Library(开放的资产导入库)的缩写。Assimp能够导入很多种不同的模型文件格式(并也能够导出部分的格式),它会将所有的模型数据加载至Assimp的通用数据结构中。
在这里插入图片描述

当Assimp加载完模型之后,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式,它都能够将我们从这些不同的文件格式中抽象出来,用同一种方式访问我们需要的数据。
在这里插入图片描述

为 C 和 C++ 提供了 API。与其他语言(C#、Java、Python、Delphi、D)有各种绑定。Assimp 还可以在 Android 和 iOS 上运行。 此外,Assimp 还具有各种网格后处理工具:法线和切线空间生成、三角测量、顶点缓存局部优化、去除退化基元和重复顶点、按基元类型排序、合并冗余材料等等。

2、下载编译

https://github.com/assimp/assimp
https://github.com/assimp/assimp/blob/master/Build.md
https://assimp-docs.readthedocs.io/en/latest/about/quickstart.html#assimp-static-lib

  • 下载代码
git clone https://github.com/assimp/assimp.git

在这里插入图片描述

  • 构建工程
cd assimp
cmake CMakeLists.txt 

在这里插入图片描述

cmake --build .

在这里插入图片描述
编译生成文件如下:
在这里插入图片描述
在这里插入图片描述

3、代码测试

3.1 C++

编译了assimp库文件之后,再使用它自带的测试工程进行测试如下:
在这里插入图片描述
比如SimpleOpenGL示例打开如下:
在这里插入图片描述
编译运行如下:
在这里插入图片描述
vs2017工程的参数设置的注意事项:
项目配置:
a. 项目属性 ----> C/C++ —> 附加包含目录 —> your_path\assimp-master\include
b. 项目属性 ----> 链接器 —> 常规 —> 附加库目录 —> your_path\lib
c. 项目属性 ----> 链接器 —> 输入 —> 附加依赖项 —> assimp-vc141-mtd.lib
在这里插入图片描述
这里使用一个更为简单的例子进行说明assimp开发流程如下:

#include <stdlib.h>
#include <stdio.h>#include <assimp/postprocess.h> // Post processing flags
#include <assimp/scene.h> // Output data structure
#include <assimp/Importer.hpp> // C++ importer interface
#include <iostream>#pragma comment(lib, "assimp-vc141-mtd.lib")void LoadFinish(const aiScene *scene) {std::cout << "LoadFinish ! NumVertices : " << (*(scene->mMeshes))->mNumVertices << std::endl;
}bool LoadModel(const std::string &pFile) {// Create an instance of the Importer classAssimp::Importer importer;// And have it read the given file with some example postprocessing// Usually - if speed is not the most important aspect for you - you'll// probably to request more postprocessing than we do in this example.const aiScene *scene = importer.ReadFile(pFile,aiProcess_CalcTangentSpace |aiProcess_Triangulate |aiProcess_JoinIdenticalVertices |aiProcess_SortByPType);// If the import failed, report itif (!scene) {std::cout << importer.GetErrorString() << std::endl;return false;}// Now we can access the file's contents.LoadFinish(scene);// We're done. Everything will be cleaned up by the importer destructorreturn true;
}int main() {LoadModel("C:\\Users\\tomcat\\Desktop\\globe\\globe.obj");return 0;
}

运行代码如下:
在这里插入图片描述

3.2 pyassimp(Python)

https://github.com/assimp/assimp/blob/master/port/PyAssimp/README.md

一个简单的 Python 包装器,用于访问 Assimp,用于访问库。 需要 Python >= 2.6。

PyAssimp 带有一个简单的 3D 查看器,显示如何加载和显示 3D 使用基于着色器的 OpenGL 管道进行建模。
PyAssimp 需要一个 assimp 动态库(在 windows、linux、macOS 上)才能工作。

  • 安装:PyAssimp
python setup.py install
# or
pip install pyassimp

在这里插入图片描述

  • 要加载一个名为 第一个网格的顶点
from pyassimp import load
with load('hello.3ds') as scene:assert len(scene.meshes)mesh = scene.meshes[0]assert len(mesh.vertices)print(mesh.vertices[0])

在这里插入图片描述
运行发生错误,提示assimp库文件不存在。
将上面编译生成的文件assimp-vc141-mt.dll放在下面文件夹里面。
在这里插入图片描述
再重新编译运行代码如下:
在这里插入图片描述

  • 另一个列出“顶级节点”的示例
from pyassimp import load
with load('hello.3ds') as scene:for c in scene.rootnode.children:print(str(c))

运行代码如下:
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关文章:

  • buuctf[极客大挑战 2019]BabySQL--联合注入、双写过滤
  • CMake入门教程【高级篇】CPack打包项目Linux的deb和windows的msi
  • go work
  • 制作出色的 GitHub 个人资料
  • C#编程-描述内存分配
  • 2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序
  • Python学习之路-编码风格
  • 外包做了5个月,技术退步一大半了。。。
  • 《计算机网络》 第三章 数据链路层
  • PostgreSQL ZIP版安装完全手册
  • Diffusion扩散模型学习3:Unet学习实现
  • 2023春季李宏毅机器学习笔记 03 :机器如何生成文句
  • 【实用技巧】Windows 电脑向iPhone或iPad传输视频方法1:无线传输
  • 杨中科 ASP.NET Core 中的依赖注入的使用
  • 寒假前端第一次作业
  • (三)从jvm层面了解线程的启动和停止
  • Angular 2 DI - IoC DI - 1
  • Computed property XXX was assigned to but it has no setter
  • Cookie 在前端中的实践
  • happypack两次报错的问题
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • input实现文字超出省略号功能
  • JavaScript创建对象的四种方式
  • Linux下的乱码问题
  • Mysql数据库的条件查询语句
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 闭包--闭包作用之保存(一)
  • 创建一个Struts2项目maven 方式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 高度不固定时垂直居中
  • 回顾2016
  • 记录一下第一次使用npm
  • 利用DataURL技术在网页上显示图片
  • 人脸识别最新开发经验demo
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 在Mac OS X上安装 Ruby运行环境
  • 怎么把视频里的音乐提取出来
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • k8s使用glusterfs实现动态持久化存储
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Spring Boot 分片上传文件
  • ​水经微图Web1.5.0版即将上线
  • #NOIP 2014#Day.2 T3 解方程
  • $$$$GB2312-80区位编码表$$$$
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (12)目标检测_SSD基于pytorch搭建代码
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (七)c52学习之旅-中断
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十三)Maven插件解析运行机制