【小沐学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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/232679.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF.js实现搜索多个不同的关键词高亮显示效果

static\PDF\web\viewer.js 392行左右 // 自定义搜索关键词---------------------------------------- this.searchKeywords = keyword => {if (typeof PDFViewerApplication !== undefined) {PDFViewerApplication.eventBus.dispatch(find, {query: keyword,caseSensitive:…

AQS 抽象队列同步器

AQS AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及JUC的基石&#xff0c;主要用于解决锁分配给谁的问题整体…

互联网演进历程:从“全球等待”到“全球智慧”的技术革新与商业变革

文章目录 一、导言二、World Wide Wait (全球等待)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 三、World Wide Web (万维网)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 四、World Wide Wisdom (全球智慧)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 五、…

MySQL——用户管理

目录 一.用户管理 二.用户 1.用户信息 2.创建用户 3.删除用户 4. 修改用户密码 三.数据库的权限 1.给用户授权 2.回收权限 一.用户管理 如果我们只能使用root用户&#xff0c;root的权限非常大,这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理&#xff…

苦学golang半年,写了一款web服务器

苦学golang半年&#xff0c;写了一款web服务器 文章目录 苦学golang半年&#xff0c;写了一款web服务器example 项目地址&#xff1a;https://github.com/fengyuan-liang/jet-web-fasthttp 可以的话&#xff0c;请star支持一下&#x1f642; 苦学golang半年&#xff0c;写了一款…

java基于vue的音乐播放器的设计与实现论文

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

【Spring Cloud】Feign组件的使用及参数的传递

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…

浅析观察者模式在Java中的应用

观察者模式&#xff08;Observer Design Pattern&#xff09;,也叫做发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;、模型-视图&#xff08;Model-View&#xff09;模式、源-监听器&#xff08;Source-Listener&#xff09;模式、从属者&#xff08;D…

强化学习5——动态规划在强化学习中的应用

动态规划在强化学习中的应用 基于动态规划的算法优良 &#xff1a;策略迭代和价值迭代。 策略迭代分为策略评估和策略提升&#xff0c;使用贝尔曼期望方程得到一个策略的状态价值函数&#xff1b;价值迭代直接使用贝尔曼最优方程进行动态规划&#xff0c;得到最终的最优状态价…

【SpringCloud】之配置中心(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

5年经验之谈 —— 探索自动化测试用例设计粒度!

自动化测试用例的粒度指的是测试用例的细致程度&#xff0c;即每个测试用例检查的功能点的数量和范围。 通常&#xff0c;根据测试用例的粒度&#xff0c;可以被分为3种不同的层次&#xff0c;从更低层次的细粒度到更高层次的粗粒度。 第一种&#xff1a;单元测试 - 细粒度 单…

node:全局对象事件环buffer

node&#xff1a;全局对象&事件环&buffer 全局对象 exports/module/require/__dirname/__filename&#xff1a;这些是参数 global全局对象&#xff0c;挂载global上的 process process 进程&#xff0c;代码node服务都是跑在一个进程里面。进程和集群 process上常用属性…

muduo网络库剖析——网络地址InetAddress类

muduo网络库剖析——网络地址InetAddress类 前情从muduo到my_muduo 概要socketaddr_in介绍成员用法 网络地址转换函数 框架与细节成员函数使用方法 源码 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xf…

rime中州韵小狼毫 help lua Translator 帮助消息翻译器

lua 是 Rime中州韵/小狼毫输入法强大的武器&#xff0c;掌握如何在Rime中州韵/小狼毫中使用lua&#xff0c;你将体验到什么叫 随心所欲。 先看效果 在 rime中州韵 输入效果一览 中的 &#x1f447; help效果 一节中&#xff0c; 我们看到了在Rime中州韵/小狼毫输入法中输入 h…

Mediant approximation trick

近似值的一个取值技巧 如果知道一个数值变量的上限和下限&#xff0c;那么有一种快速的方法&#xff0c;快速获取该变量更准确的近似值。 比如&#xff0c;已知变量e的大小范围是19/7 < e < 87/32&#xff0c;就可以快速得到它的近似值。 Suppose you are trying to ap…

Navicat 技术干货 | 如何查看关系型数据库(MySQL、PostgreSQL、SQL Server、 Oracle)查询的运行时间

在数据库优化中&#xff0c;理解和监控查询运行时间是至关重要的。无论你是数据库管理员、开发人员或是参与性能调优的人员&#xff0c;知道如何查看查询运行时间能为你的数据库操作提供有价值的参考。本文中&#xff0c;我们将探索几款热门的关系数据库&#xff08;如 MySQL、…

大模型实战营Day1 书生·浦语大模型全链路开源体系

1.大模型为发展通用人工智能的重要途经 专用模型&#xff1a;针对特定任务解决特定问题 通用大模型&#xff1a;一个模型对应多模态多任务 2.InternLM大模型开源历程 3.InternLM-20B大模型性能 4.从模型到应用&#xff1a;智能客服、个人助手、行业应用 5.书生浦语全链条开源…

20240106-换一种思维,工作也不过就是一种挣钱的方式而已了

今天在车上一个百度的同事聊抱怨说&#xff1a;累了&#xff0c;真的累了&#xff0c;干不动了&#xff0c;想跑路了&#xff0c;不想打工了。我们之前也会经常聊到和吐槽这种事情&#xff0c;但是我最近由于思维的一些改变&#xff0c;所以就想到把这个事情记录下来。 在大厂…

vue-springboot基于JAVA的小碗菜外卖套餐订单系统的设计与实现9r2r3

想要使用这个平台进行购买物品或服务的人具体的功能需求分为注册登录、餐品购买&#xff0c;餐品搜索&#xff0c;购物车&#xff0c;个人中心&#xff0c;查看已购买过的餐品&#xff0c;餐品评价。具体功能模块描述&#xff1a; &#xff08;1&#xff09;注册登录 想要使用这…

[MAUI]在.NET MAUI中调用拨号界面

在.NET MAUI中调用拨号界面 前置要求: Visual Studio 2022 安装包“.NET Multi-platform App UI 开发” 参考文档: 电话拨号程序 新建一个MAUI项目 在解决方案资源管理器窗口中找到Platforms/Android/AndroidManifest.xml在AndroidManifest.xml中添加下文中…块如下:<?xml…