assimp 是一个开源的模型加载库,支持非常多的格式,还有许多语言的 binding,这里我们选用 assimp 的 python 的 binding 来加载模型文件。不过社区主要是在维护 assimp 的 C++ 代码,对于这些 binding 可能更新的不够及时,比如 python 版本的就存在一些问题。

assimp 的源码

1. 安装 pyassimp

官方的编译的指南,有些坑还是需要踩一下。

pyassimp 只是 assimp 的一个 wrapper,所以计算上还必须有 assimp 的库才行,还是免不了要去编译 assimp。

这里推荐采用 vcpkg 的进行管理,windows 上需要装一下 visual studio,mac 需要装一下 xcode,这些软件也是标配了。我的电脑是 macOS,这里有个坑需要注意一下,vcpkg 这个默认编译是静态库 .a,我们需要编译动态库,所以需要改一下 vcpkg 的编译选项。如下 vcpkg/triplets/x64-osx.cmake 中将如下选项改为 dynamic

set(VCPKG_LIBRARY_LINKAGE dynamic)

依次执行以下命令即可。

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install assimp

等待编译完成,即可在 vcpkg/packages/assimp_x64-osx/lib 中找到动态库 .dylib 文件,windows 应该也是差不多的路径。

然后可以用 pip 来安装 pyassimp

注意! 这里有个坑,pyassimp 的 4.1.4 版本,现在默认最新版本,存在 bug,加载模型可能会随机 crash,github 上有个 issue 在讨论这个事情,大家目前的解决方案就是回退到 4.1.3 所以在安装的时候,我们指定一下版本。

pip install pyassimp==4.1.3

2. 调用 pyassimp API 加载模型

这个时候如果直接调用加载 API 加载模型,会报找不到库的错误:

raise AssimpError("assimp library not found")
pyassimp.errors.AssimpError: assimp library not found

因为 vcpkg 安装的 assimp 的库不在 pyassimp 的搜索路径下,看了一下 pyassimp 搜索库的路径,基本上常用的库的路径他都搜索来,我们有两种方法,1. 创建一个软链接到搜索路径中, 2. 将 assimp 库的路径加入环境变量 LD_LIBRARY_PATH 中。

为了方便我创建一个软链接到系统库中

ln -s {你的 assimp 库的路径} /usr/local/lib

然后我们执行下面的代码,主要 path 换成你的模型文件,这下就可以找到库文件了。

import pyassimp
path = "box.fbx"
scene = pyassimp.load(path)
print(scene.meshes[0].vertices.shape)

3. 总结

  1. 用 vcpkg 编译得到 assimp 的库,注意修改编译选项;
  2. 安装 pyassimp 的 4.1.3 版本!!;
  3. 将 assimp 库放到 pyassimp 可以找到的地方

[CG从零开始] 3. 安装 pyassimp 库加载模型文件的更多相关文章

  1. tensorflow学习笔记2:c++程序静态链接tensorflow库加载模型文件

    首先需要搞定tensorflow c++库,搜了一遍没有找到现成的包,于是下载tensorflow的源码开始编译: tensorflow的contrib中有一个makefile项目,极大的简化的接下来 ...

  2. WPF 3D动态加载模型文件

    原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...

  3. WebGL学习笔记(十二):加载模型文件

    目前为止,我们用到的模型顶点uv信息等,都是直接定义在代码中的,实际使用中,这些数据应该是由3D编辑器编辑好后按照一定的格式存储在文件中的,我们需要从文件中提取出对应的数据之后,组合成我们可以使用的信 ...

  4. XP安装IIS来加载aspx页面(Web调用SAP数据)

    1,安装IIS 在XP中安装IIS方法很简单,安装时需要提供安装光盘来加载I386文件,可以使用虚拟光驱或光盘.在此做个简单说明(控制面板-添加/删除 Windows组件-勾选Internet信息服务 ...

  5. NeHe OpenGL教程 第三十一课:加载模型

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. 安卓奇葩问题之.so库加载不了

    真是哔了狗了. 今天突然遇到一个问题:之前用第三方的密码控件,给了一个.so库文件.然后我就放在了/jniLibs/armeabi目录下. 运行,一切都很OK. 然后重点来了.N天之后的今天,突然打包 ...

  7. 使用Redirector插件解决googleapis公共库加载的问题【转】

    转自:http://www.cnblogs.com/kari/p/5860371.html 最近访问一些面向国外的网站总是会出现ajax.googleaips.com无法加载的情况.以下为加载stac ...

  8. 使用Redirector插件解决googleapis公共库加载的问题

    最近访问一些面向国外的网站总是会出现ajax.googleaips.com无法加载的情况.以下为加载stackoverflow时的情境: 图1 -无法加载的google公共库 问题的原因是谷歌没有在国 ...

  9. LIB库加载方法-引用百度百科

    LIB库加载方法,有三种,如下: 1.LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中\"Add Files to Project\ ...

随机推荐

  1. 不是第七代的 Win 7

    贡献者:历史上的今天 Windows 7 是由微软公司(Microsoft)2009 年 10 月 22 日发布的桌面端操作系统,它影响了每个行业的方方面面,以至于很多人仍然在日常生活和工作中使用它. ...

  2. Go 接口:深入内部原理

    接口的基本概念不在这里赘述,详情请看第十六章:接口 nil 非空? package main func main() { var obj interface{} obj = 1 println(obj ...

  3. ZJOI2016 小星星 题解

    我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...

  4. 面试突击71:GET 和 POST 有什么区别?

    GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发的 RESTful 接口中,都能看到它们的身影.而它们之间的区别,也是一道常见且经典的面试题,所以我们本文就来详细的聊聊. H ...

  5. 【AGC】开放式测试示例

    前言:这一次我们来带大家进入AGC领域,学习AGC相关的知识.所谓AGC就是AppGallery Connect的简称,为用户的应用进行创意.开发.分发.运营.经营各环节提供一站式服务,说的通俗一点, ...

  6. ACM模式细节

    牛客网的ACM模式需要自己写输入输出,在这里简单记录一下: 基本答题框架: import java.util.*; public class Main{ public static void main ...

  7. 【面试题】JSON.stringify()妙用,你真的知道吗?

    JSON.stringify()妙用 点击打开视频讲解更加详细 语法:JSON.stringify(value, replacer , space) value:将要序列化成 一个JSON 字符串的值 ...

  8. 历时2月,动态线程池 DynamicTp 发布里程碑版本 V1.0.8

    关于 DynamicTp DynamicTp 是一个基于配置中心实现的轻量级动态线程池管理工具,主要功能可以总结为动态调参.通知报警.运行监控.三方包线程池管理等几大类. 经过多个版本迭代,目前最新版 ...

  9. 简单html js css 轮播图片,不用jquery

    这个是自己修改的轮播图片,在网上有的是flash 实现的轮播图片,对搜索引擎不友好, 比如:dedecms 的首页的轮播图是用flash实现滚动的. 所以这个自己修改了一下,实现html+js+css ...

  10. 「题解报告」Blocks

    P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...