首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Assimp不加载从blender中导出的obj文件的层次结构

Assimp(Open Asset Import Library)是一个用于加载、处理和导出3D模型的开源库。它支持多种3D文件格式,包括OBJ。然而,有时在使用Assimp加载从Blender导出的OBJ文件时,可能会遇到层次结构(如骨骼动画或嵌套的网格)未能正确加载的问题。以下是一些基础概念以及可能的解决方案:

基础概念

OBJ文件格式:OBJ是一种简单的文本格式,用于存储3D模型数据,包括顶点、纹理坐标、法线和面。

层次结构:在3D模型中,层次结构通常指的是模型的组成部分如何组织在一起,例如一个角色模型可能由多个子网格(如头部、身体、四肢)组成,这些子网格又可能有自己的变换矩阵。

Assimp库:Assimp是一个跨平台的库,用于导入各种3D模型格式到应用程序中。

可能的原因

  1. 导出设置问题:Blender在导出OBJ文件时可能没有正确设置层次结构信息。
  2. Assimp版本问题:使用的Assimp版本可能不支持某些OBJ文件的特定特性。
  3. 文件损坏或不兼容:导出的OBJ文件可能在传输过程中损坏,或者包含Assimp不支持的特性。

解决方案

1. 检查Blender导出设置

确保在Blender中导出OBJ时,选择了正确的选项来保留层次结构信息。例如,确保“Group Objects”和“Write Materials”选项被勾选。

2. 更新Assimp库

确保你使用的是最新版本的Assimp库,因为新版本可能修复了旧版本中的bug,并增加了对新特性的支持。

3. 使用其他格式

如果OBJ格式存在问题,可以尝试将模型导出为其他格式,如FBX或Collada(DAE),这些格式通常能更好地保留层次结构和动画信息。

4. 示例代码

以下是一个使用C++和Assimp加载OBJ模型的示例代码:

代码语言:txt
复制
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

int main() {
    Assimp::Importer importer;
    const aiScene* scene = importer.ReadFile("path_to_your_model.obj", 
        aiProcess_Triangulate | 
        aiProcess_FlipUVs | 
        aiProcess_GenNormals | 
        aiProcess_CalcTangentSpace);

    if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
        std::cerr << "ERROR::ASSIMP::" << importer.GetErrorString() << std::endl;
        return -1;
    }

    // 遍历层次结构
    processNode(scene->mRootNode, scene);

    return 0;
}

void processNode(aiNode* node, const aiScene* scene) {
    // 处理节点...
    for (unsigned int i = 0; i < node->mNumMeshes; i++) {
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
        processMesh(mesh, scene);
    }

    // 递归处理子节点
    for (unsigned int i = 0; i < node->mNumChildren; i++) {
        processNode(node->mChildren[i], scene);
    }
}

void processMesh(aiMesh* mesh, const aiScene* scene) {
    // 处理网格...
}

应用场景

  • 游戏开发:在游戏中加载复杂的3D模型和环境。
  • 虚拟现实:创建沉浸式的VR体验需要精确的3D模型加载。
  • 动画制作:处理角色动画和复杂的层次结构变换。

通过以上步骤和代码示例,你应该能够解决Assimp加载OBJ文件时层次结构未能正确加载的问题。如果问题仍然存在,可能需要进一步检查模型文件本身或寻求社区的帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Importing and exporting shapes

如果在导入操作之后,你在场景中看不到任何形状,但是场景层次结构显示了新添加的形状,那么很可能你的形状太大或太小而无法被看到。...另外,当从CAD应用程序导出网格时,尝试将它们作为一个整体导出(最好是将它们作为一个单独的对象导出,稍后在V-REP中,可以使用 [Menu Bar --> Edit --> Grouping/Merging...确保导入的网格不包含太多的三角形(之前有过具体的介绍,对于机器人来说,通常在10000-20000个三角形之间),否则V-REP会大大降低速度(渲染,计算,加载/保存操作等等)。...(注意:只会导出选中的对象): OBJ:波前技术文件格式。 STL(二进制):3D系统文件格式。导出只支持二进制格式。这是V-REP中最紧凑的导出选项。...V-REP的Assimp插件也处理导出功能。请查看这里的API函数。

1.3K10

NDK OpenGL ES 3.0 开发(二十):3D 模型

OBJ 文件的结构 本文主要介绍 obj 3D 模型文件及其附属文件 mtl ,下面是 obj 模型文件的数据结构(为了方便展示部分数据被略过)。...模型加载库 Assimp Assimp 全称为 Open Asset Import Library,可以支持几十种不同格式模型文件的解析(同样也可以导出部分模型格式),Assimp 本身是 C++ 库,...当导入一个模型文件时,Assimp 将加载该模型文件所包含的所有模型和场景数据到一个 scene 对象,为这个模型文件中的所有场景节点、模型节点都生成一个具有对应关系的数据结构,如下图所示: ?...Assimp生成的模型文件数据结构 一个模型往往是由很多小模型组成,这些小模型在 Assimp 中称之为 Mesh ,Mesh 进行独立渲染,Mesh 对象本身包含渲染所需的所有相关数据,比如顶点位置、...从 Github 下载 Assimp(本文使用的是 assimp-v.5.0.0) 源码并解压到一个新建文件夹 BuildAssimp 中; 2.

1.5K30
  • CG-Assignment1

    具体实现如下: 实现obj文件的加载 对模型加键盘控制,通过键盘可以实现模型的缩放、平移和旋转。...2.2.1 OBJ文件的加载 首先是对于OBJ文件的加载,我使用了一个非常流行的模型导入库——Assimp Assimp能够导入很多种不同的模型文件格式,它会将所有的模型数据加载至Assimp的通用数据结构中...当Assimp加载完模型之后,就能够从Assimp的数据结构中提取所需的所有数据。...Assimp来加载模型至Assimp的一个叫做scene的数据结构中 #include assimp/Importer.hpp> #include assimp/scene.h> #include...第三章占整体篇幅的30%。 模型加载和显示问题:最初尝试自己解析和加载OBJ文件时,我遇到了各种问题,包括正确读取文件、解析顶点、法线和纹理坐标数据等。这些问题耗费了很多时间。

    3800

    OpenGL及其相关开源库:深入探析图形编程工具与原理

    Assimp(Open Asset Import Library):是一个功能强大的库,专门用于导入和导出各种不同格式的3D模型文件。...在图形编程中,经常需要处理来自不同来源和不同格式的3D模型,比如OBJ、FBX、Collada等。...Assimp库提供以下支持: 支持多种文件格式:Assimp支持导入和导出多种常见的3D模型文件格式,包括但不限于OBJ、FBX、Collada、STL、3DS等。...统一的数据结构:Assimp将不同格式的模型文件转换为统一的数据结构,使得开发者可以以统一的方式访问模型的顶点、法线、纹理坐标等信息。...额外的功能:除了基本的模型导入和导出功能之外,Assimp还提供了一些额外的功能,如网格处理、纹理加载、材质处理等。

    2.3K10

    如何把GEOJSON或Shp shapefile转三维城市模型,带贴图UV,导出为OBJ GLTF STL格式

    Geobuilding更新了导出为3D模型文件功能。在软件生产的建筑物数据,或第三方导入的矢量建筑数据都可以转换为模型。可导出为OBJ GLTG STL模型格式。...支持Geojson或Shapefile格式导出为三维模型文件支持导出模型的UV坐标,法线坐标,分为楼面和楼顶,方便使用。支持计算模型在真实世界的地理坐标设计贴图模式,预览贴图效果。...导出的模型包含了UV坐标和法线坐标,可以自由替换贴图资源。在Geobuilding中加载模型,完美对其地理坐标。模型结构清晰,方便使用。...在实际应用中,可以使用自己的贴图替换Buildingface和buildingtop材质。OBJ格式,支持导出携带材质。...在blender中效果下载地址 https://pan.baidu.com/s/1oE88nHiDt1YflvIEmK2LKw?pwd=1234

    69610

    Blender+Geant4一文入门3D模型文件导入

    Blender绘制3D模型并导出为*.obj格式文件 2. Geant4导入*.obj文件并抽取3D模体 3. 总结与展望 1. Blender绘制3D模型并导出为*.obj格式文件 a....导出*.obj文件: 一同默认导出的还有*.mtl材质文件,G4中用不到。菜单栏中File->Export->Wavefront(.obj)导出*.obj文件。 ? 图7 *.obj文件导出 2....参见Blender中对不同模体的命名: ? 图8 不同模体的命名 2. 导出文件名为20200708-mura19camera.obj,存入/B1/,vi *.obj打开看一看: ?...总结与展望 从Blender建模到导入Geant4可以概括为以下几点: 在Blender中建立模型,注意模体命名包括实体及顶点编辑组; 在Geant4中按名字导入solid,注意单位换算,solid初始默认位置与...*.obj格式将3D几何存储为纯文本ASCII文件,可以打开查看,每个模体名字后跟随其相关的顶点和面坐标。待熟练整个流程后,便是简单的Blender建模加Geant4使用。 ?

    2.6K30

    OpenGL ES 3D 模型的加载和渲染

    3D 模型渲染 上一节简单介绍了常用的 3D 模型文件 Obj 的数据结构和模型加载库 Assimp 的编译,本节主要介绍如何使用 Assimp 加载 3D 模型文件和渲染 3D 模型。...,把结构体作为它的第一个参数,第二个参数是这个结构体名字的变量,函数返回这个变量从结构体开始的字节偏移量(offset)。...加载 3D 模型比较简单,最终模型被加载到一个 Assimp 中定义的 aiScene 对象中,aiScene 对象除了包含一些网格和材质,还包含一个 aiNode 对象(根节点),然后我们还需要遍历各个子节点的网格...Model 类中加载模型的函数: void loadModel(string const &path) { Assimp::Importer importer; const aiScene...: //初始化,加载模型 m_pModel = new Model("/sdcard/model/poly/Apricot_02_hi_poly.obj"); m_pShader = new Shader

    1.8K20

    NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染

    3D 模型渲染 上一节简单介绍了常用的 3D 模型文件 Obj 的数据结构和模型加载库 Assimp 的编译,本节主要介绍如何使用 Assimp 加载 3D 模型文件和渲染 3D 模型。...,把结构体作为它的第一个参数,第二个参数是这个结构体名字的变量,函数返回这个变量从结构体开始的字节偏移量(offset)。...加载 3D 模型比较简单,最终模型被加载到一个 Assimp 中定义的 aiScene 对象中,aiScene 对象除了包含一些网格和材质,还包含一个 aiNode 对象(根节点),然后我们还需要遍历各个子节点的网格...Model 类中加载模型的函数: void loadModel(string const &path) { Assimp::Importer importer; const aiScene...: //初始化,加载模型 m_pModel = new Model("/sdcard/model/poly/Apricot_02_hi_poly.obj"); m_pShader = new Shader

    92230

    开源篇--精准定位 模型重心坐标

    换算成笛卡尔坐标系 三角形三个顶点为 那么重心坐标 = 到了我们三维模型中,重心坐标依旧和这个公式类似,等于所有三角面重心点之和的平均值。...模型重心如下图所示: Part3代码获取模型重心 这里我们通过assimp库来获取模型的重心。关于assimp,参考我们上一篇文章。...分为以下几个步骤: 1、加载模型获取aiScene 2、遍历aiScene下RootNode下的所有节点 3、获取aiMesh来计算模型的重心 1加载模型 加载模型示例代码如下: auto inFile...的场景是一个树状结构,从root节点开始,如下图 我们通过递归进行遍历 void FindMesh(const aiScene *scene, aiNode *node) { FindMeshInfo...整个重心点坐标,只需要Z轴取反,即可和3dmax一致 1、当3dmax导出的fbx为Y轴向上时 3dmax坐标如下: box01:中心点坐标(0,-0.5,1) box02:中心点坐标(0,1.5,1)

    1.6K20

    Revit导出为GLTF

    Revit文件导出为GLTF格式Revit文件和GLTF格式都有广泛的用途,在模型应用工作中,经常需要将Revit文件导出为GLTF格式,怎么将Revit文件导出为GLTF格式呢?...下载完成后,双击安装包文件,根据安装引导,完成插件的安装。注意:安装过程中不要更改软件的默认安装目录。安装完成后,第一次打开Revit软件,会出现插件加载提示,选择【总是载入】,以后打开就会默认加载。...插件加载完成后,在Revit软件顶部出现新的菜单项【NSDT】,点击菜单,即可打开插件。格式转换当用户在Revit设计软件中完成模型设计后,可开始使用模型格式转换插件。...在插件页面选择需要转换的目标格式,目前插件支持8种目标格式:GLTF、OBJ、GLB、DAE、STL、OFF、XYZ和PLY。选择需要导出的目标格式:GLTF。...在模型预览界面,用户通过【模型分享】按钮,可进行模型团队分享或免费分享;通过【下载】按钮,可将模型文件文件导出为GLTF格式。回到Revit设计界面,点击【发送下一个】进行新的模型格式转换。

    55810

    将shp geojson建筑白模导出成带屋顶的贴图建筑模型 obj gltf

    最近遇到的一个新的需求,将基础建筑白模转换成带屋顶的建筑模型。如下图。既然是导出功能,就涉及到程序化操作。那么如何程序化生成屋顶结构?...常见的屋顶有下面几种除了第一种平面屋顶,坡面屋顶,弧面屋顶像蔬菜大棚、厂房等。人字形屋顶等。程序化屋顶生成的核心是计算屋脊线,基于屋脊线计算顶点坐标构建geometry。计算法线坐标,满足屋顶光照。...可询问deepseek或claude获取进一步的思路。经过理论支持和一些算法调试,Geobuilding增加了自定义屋顶属性,一键导出屋顶模型,包括obj gltf stl格式。...(左侧工具条[选择框]可批量设置屋顶属性)第2步直接导出为模型文件在导出面板,选择自定义的贴图材质最后我们将导出的obj文件导入到blender中查看效果,导入blender时注意选择z轴朝上很好,我们得到了符合预期的模型文件也可以导出...gltf模型包含cesium演示文件,直接打开浏览。

    8810

    MMD渲染整活笔记(一)

    不过仔细研究发现,模型中还有很多贴图没有被载入。研究了下发现,主要是两类,一类是sphere贴图,另一类是toon贴图,然而Assimp并没有载入这两种贴图。...而且在载入另一个模型的时候还出现了mesh没解析出正确材质的问题。所以没办法,我开始阅读Assimp。 Assimp的代码结构还是非常清晰的,看CMakeLists就能大致了解整个项目结构。...然鹅很神奇的是MMDImporter里并没有把这个数据转换成Assimp的格式,推测原因是Assimp的数据结构并没有能正确存储这两种贴图的方式。...然后找到了一个看起来非常靠谱的东西:benikabocha/saba。saba不仅是个mmd模型浏览器,还提供了PMX/VMD的文件解析。更秀的是,saba直接实现了骨骼动画,还增加了物理运算。...下一篇,就使用saba来加载MMD模型好了。

    1.3K00

    OpenGLES_入门07_加载3D模型

    学习是一件开心的额事情 OpenGL 自身不能直接加载模型文件,我们的思路很简单,就是把模型文件转成顶点数据,颜色数据,法线向量数据,纹理坐标,然后通过OpenGL 提供的API 把数据导入。...学习目标 把OBJ 文件转换为顶点坐标 开始吧 我使用Blender 建模工具演示 创建一个Obj文件 ? 让学习成为一种习惯 2.导出为Obj文件 ? 让学习成为一种习惯 ?...让学习成为一种习惯 5.进入刚才的模型文件夹中(输入CD 然后把文件拖进去) ? 让学习成为一种习惯 按回车键 ?...让学习成为一种习惯 6.执行转换命令 perl obj2opengl.pl sphere.obj 生成我们需要的头文件 ? 让学习成为一种习惯 我们打开文件看一下 ? 顶点数量和顶点数组 ?...法线向量数组 有些建模工具直接可以到数据的,不用这么麻烦!

    1.2K30

    Blender + Python:用少量有效数据绘制势能面示意图的方法

    这种图正规绘制需要大量的单点计算,并用软件描面画成。但是实际上,我无法计算出如此多的单点来绘制一张图,毕竟在一般的计算有机工作中,单是定位过渡态就够普通鼠标侠喝一壶了,更别说选CV扫描并绘图了。...因此只能利用现用的计算数据合理规划着绘制,也就是说我只能依据目前算出的几个结构的数据,或者IRC上的点进行绘制。 经朋友启发,组织了一个简易的流程,来画这种简易的示意图。...(当然,我们可以使用调整,直接捏出想要的形状,但是我们目的不是在Blender中捏出,只是利用其捏出基本形貌,后利用坐标在常用的科研作图软件中插值制作出符合审美的示意图,所以我建议使用刷选并只改变Z值,...比如我可以随手捏出这么一个ts连接两个minimum的示意图,看起来比较丑陋 捏平面 导出为xyz坐标 此时保存一下自己捏的势能草面,然后进入物体模式,鼠标拖拉选中势能草面 文件 >> 导出 >> Waveforont...(.obj) 勾中仅导出选中的物体 几何数据只选三角面 很幸运,.obj是文本可以进行文本解析,也可以用windows自带的3D查看器打开 3D查看器 3.

    1.7K10

    教你用 webgl 快速创建一个小世界

    Obj文件简单来说就是包含一个3D模型信息的文件,这里信息包含:顶点、纹理、法线以及该3D模型中纹理所使用的贴图。....png] 前两行看到#符号就知道这个是注释了,该obj文件是用blender导出的。...具体实现 1、首先建模生成obj文件 这里我们使用blender生成文字 !...== null) { obj.loadImg(result[1]); // 加载图片 } } 代码核心的地方都进行了注释,注意这里的正则只去匹配我们obj文件中含有的字段,其他信息没有去匹配...文件中f(ace)行中4个值的情况,导出obj文件中可以强行选择只有三角面,不过我们在代码中兼容一下比较稳妥 4、旋转平移等变换 物体全部导入进去,剩下来的任务就是进行变换了,首先我们分析一下有哪些动画效果

    3.4K00

    Assimp Android 编译

    本文详细介绍如何编译适用于Android平台的.so库,并记录过程中踩到的坑。 准备知识 将一个C++的工程编译成Android平台可用的.so库,需要用到一些额外的工具。...可以把make理解为批处理工具,批量处理makefile中的命令。 cmake和CMakeLists.txt 上面提到,当命令比较多的时候,我们把命令写到makefile中,通过make程序批量处理。...=TRUE 支持OBJ格式的3D模型文件导入 -DASSIMP_BUILD_FBX_IMPORTER=TRUE 支持FBX格式的3D模型文件导入 -DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT...获得libassimp.so文件 上面make如果没出错的话,直接去assimp/buildAndroid/code目录下寻找libassimp.so文件吧,这个就是我们的目标啦。...Assimp编译实录 Compile Assimp Open Source Library For Android Windows环境下编译Assimp库生成Android可用的.so文件 Android

    2.5K40

    WebGL 开发 3D 项目的详细流程

    3.项目设计场景设计:确定场景中的元素(如模型、灯光、相机)。设计场景布局和交互逻辑。模型准备:使用 3D 建模工具(如 Blender、Maya)创建或导出模型。...将模型转换为 WebGL 支持的格式(如 glTF、OBJ)。UI 设计:设计用户界面(如按钮、菜单、HUD)。使用 HTML/CSS 或 WebGL 框架的 UI 组件。...加载资源:加载 3D 模型、纹理、材质等资源。使用加载器(如 Three.js 的 GLTFLoader、TextureLoader)。创建场景:添加模型、灯光、相机到场景中。设置相机位置和视角。...压缩 JavaScript、CSS 和资源文件。部署:将项目部署到 Web 服务器(如 Nginx、Apache)。使用 CDN 加速资源加载。8.维护与更新Bug 修复:根据用户反馈修复问题。...WebGL 开发工具与资源Three.js:最流行的 WebGL 框架。Babylon.js:功能强大的 3D 引擎。Blender:开源的 3D 建模工具。

    9010

    OBJ 3D模型格式介绍

    OBJ 格式 OBJ 是一种几何定义文件格式,Wavefront Technologies 公司在可视化加强动画包中第一次使用了这个格式,文件格式是公开的,并具有及其优质的兼容性和跨平台、跨行业的通用性...OBJ 文件使用标准的 Polygon(多边形) 储存格式,直接储存顶点坐标和法线等数据,这导致 OBJ 文件无法导出骨骼动画,只能储存静态模型和材质信息。...规范 OBJ文件不需要任何种文件头,文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中。...补充说明 模型一般通过 3d 建模软件,例如 Blender, 3DS Max 或者 Maya 等工具建模,导出时的数据格式变化较大,我们导入模型到 OpenGL 的任务就是:将一种模型数据文件表示的模型...例如上面的 Obj 文件中,我们需要解析顶点位置,纹理坐标等数据,构成 OpenGL 可以渲染的 Mesh 对象。 obj 文件在导出时一般包括两个文件 .obj 文件和 .mtl 文件和贴图图像。

    26010

    3D领域的jpg?模型交换格式glTF概述

    2.0版本,并得到许多建模软件和渲染引擎的支持,Maya、3dmax、unity、blender等都可以导入导出glTF模型,threejs,babylonjs等web渲染引擎都提供动态加载器。...glTF文件结构概览 一个典型的glTF格式的json文件,由以下结构组成 image.png 每个结构都是单元数组,结构之间通过数组下标互相索引。...存储结构 包括buffers,bufferViews,accessors三部分 image.png buffers数组中的某个单元,指向某个二进制文件。...逆矩阵是一个重要的信息,用于计算骨骼动画时,把节点的变化从全局坐标变回局部坐标。如果不这样做,我们算出来的节点位置就是叠加了骨骼矩阵本身的双重变化,从而出现错误的结果。...在blender等建模软件、unity等游戏引擎,threejs等动态运行时库中,均获得了比较好的支持。

    4.2K52
    领券