利用assimp显示gltf

68 篇文章 2 订阅
33 篇文章 4 订阅

目录

1 编译assimp5.0.1

2 工程

2.1 pro文件:

2.2 config.h

2.3 config.h.in中注释掉如下代码:

3 运行效果


1 编译assimp5.0.1

编译过程与我的博客win10操作系统上编译assimp库_liji_digital的博客-CSDN博客描述类似。但是由于assimp5.0.1的版本较高,vs2013编译源码会报错。错误原因是BaseImporter::importerUnits采用了初始化列表赋值,不受2013支持。假如你坚持使用vs2013,可以用std::map::insert()函数代替初始化列表。

BaseImporter::BaseImporter() AI_NO_EXCEPT
: m_progress() {
	importerUnits.insert(std::pair<ImporterUnits, double>(ImporterUnits::M, 1));
	importerUnits.insert(std::pair<ImporterUnits, double>(ImporterUnits::CM, 0.01));
	importerUnits.insert(std::pair<ImporterUnits, double>(ImporterUnits::MM, 0.001));
	importerUnits.insert(std::pair<ImporterUnits, double>(ImporterUnits::INCHES, 0.0254));
	importerUnits.insert(std::pair<ImporterUnits, double>(ImporterUnits::FEET, 0.3048));
}

编译结束后,build/code/Debug目录下出现文件assimp-vc120-mtd.dll(lib)

2 工程

2.1 pro文件:

#-------------------------------------------------
#
# Project created by QtCreator 2022-04-22T13:36:43
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = widget
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp \
    mesh.cpp \
    model.cpp \
    camera.cpp

HEADERS  += widget.h \
    mesh.h \
    model.h \
    camera.h

DISTFILES += \
    model.frag \
    model.vert
INCLUDEPATH += "C:/code/assimp-5.0.1/include"
LIBS += -L"C:/code/assimp-5.0.1/build/code/Debug" -lassimp-vc120-mtd

工程中其他文件来自Learn OpenGL with Qt——加载3D模型_Italink的博客-CSDN博客_qt加载多个模型,略有改动。我的资源CSDNicon-default.png?t=M3K6https://mp.csdn.net/mp_download/manage/download/UpDetailed也提供下载。

注意2点:

2.2 config.h

assimp3.1.1中有config.h,而assmp5.0.1中没有config.h,取而代之的是config.h.in。在5.0.1的defs.h中,引用了并不存在的config.h,导致编译失败。解决办法是把#include <assimp/config.h>改为

#include <assimp/config.h.in>

2.3 config.h.in中注释掉如下代码:

#cmakedefine ASSIMP_DOUBLE_PRECISION 1

3 运行效果

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Assimp是一个跨平台的模型导入库,可以用于加载和处理多种不同格式的3D模型文件。它提供了一套易于使用的API,开发者可以利用这些API来加载和解析模型文件,并对其中的数据进行访问和操作。 GLTF是一种开放的3D模型文件格式,它可以保存纹理、材质、动画、几何数据等多种信息。Assimp可以通过调用相应的接口来加载和处理GLTF文件,下面是一个使用Assimp加载GLTF文件的示例: ```cpp #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> int main() { // 创建一个导入器对象 Assimp::Importer importer; // 加载GLTF文件 const aiScene* scene = importer.ReadFile("model.gltf", aiProcess_Triangulate | aiProcess_FlipUVs); if (!scene) { // 加载失败,打印错误信息 std::cout << "Failed to load GLTF file: " << importer.GetErrorString() << std::endl; return -1; } // 加载成功,可以对模型数据进行操作 // 访问场景中的根节点 aiNode* rootNode = scene->mRootNode; // 遍历场景中的所有节点 for (unsigned int i = 0; i < rootNode->mNumChildren; i++) { aiNode* childNode = rootNode->mChildren[i]; // 在此处进行更多的操作,如打印节点名称、获取节点的转换矩阵等 std::cout << "Node Name: " << childNode->mName.C_Str() << std::endl; // 访问节点的网格数据 if (childNode->mNumMeshes > 0) { aiMesh* mesh = scene->mMeshes[childNode->mMeshes[0]]; // 在此处进行更多的操作,如获取顶点数据、法线数据、纹理坐标数据等 } } // 释放资源 importer.FreeScene(); return 0; } ``` 上述示例代码中,我们使用Assimp的导入器对象`Assimp::Importer`来加载GLTF文件。在加载过程中,我们传入一些后期处理选项`aiProcess_Triangulate`和`aiProcess_FlipUVs`,用于将非三角形的面转换为三角形,并翻转纹理的纵坐标。 加载完成后,可以通过访问场景中的根节点`scene->mRootNode`来遍历模型的节点层次结构,并对各个节点进行操作。其中,`aiNode`代表一个节点,可以包含一个或多个网格数据`aiMesh`。 通过上述示例,我们可以了解到Assimp如何加载和处理GLTF文件,以及如何访问和操作模型的节点和网格数据。根据实际需求,我们可以进一步扩展代码,进行更多的处理和使用相关数据。 ### 回答2: Assimp 是一个开源的模型导入库,能够加载和处理各种3D模型格式。GLTF (Graphics Library Transmission Format) 是一种用于在不同的3D应用程序之间传输和加载3D模型的文件格式。下面是一个用Assimp加载GLTF文件的例子: 首先,你需要确保已经将Assimp库添加到你的项目中,并且能够正常链接。然后,你需要创建一个Assimp的Importer对象来加载模型文件: ``` #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.gltf", aiProcess_Triangulate | aiProcess_FlipUVs); if (!scene || scene->mFlags &amp; AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { // 加载模型失败 return -1; } // 模型加载成功,进行进一步处理 // ... return 0; } ``` 在上面的例子中,`aiProcess_Triangulate` 和 `aiProcess_FlipUVs` 是一些导入过程的选项,用来将模型的面转换为三角形,并翻转纹理的Y轴。你可以根据需要添加其他选项。 加载成功后,你可以通过访问`scene`对象的属性和方法来处理模型数据。例如,你可以通过访问`scene->mRootNode`来获取模型的根节点,并通过遍历节点树来访问模型的子节点和网格数据。 总结而言,使用Assimp加载GLTF文件需要引入Assimp库,并创建一个Importer对象来加载模型文件。加载后,你可以根据需要处理模型数据。 ### 回答3: assimp 是一个跨平台的开源库,用于加载和处理不同格式的模型文件。在加载 glTF 文件时,可以通过以下例子来说明: 首先,确保已经安装了 assimp 库,并设置好相关的开发环境。假设已经建立了一个简单的 OpenGL 窗口,可以按照以下步骤加载 glTF 文件: 1. 导入 assimp 库的头文件: ``` #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> ``` 2. 创建一个 Assimp::Importer 对象,并设置一些选项: ``` Assimp::Importer importer; // 设置一些导入选项,例如导入所有的顶点属性数据 importer.SetPropertyFloat(AI_CONFIG_PP_GSN_MAX_SMOOTHING_ANGLE, 80.0f); ``` 3. 加载 glTF 文件: ``` const aiScene* scene = importer.ReadFile("path/to/model.gltf", aiProcess_Triangulate | aiProcess_FlipUVs); if (!scene || scene->mFlags &amp; AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { // 加载失败,输出错误信息 std::cout << "Error loading model: " << importer.GetErrorString() << std::endl; return -1; } ``` 4. 遍历模型的节点和数据: ``` aiNode* rootNode = scene->mRootNode; // 遍历所有节点和它们的子节点 TraverseNode(rootNode, scene); void TraverseNode(aiNode* node, const aiScene* scene) { // 处理当前节点的信息,例如获取节点的变换矩阵等 // 遍历此节点附加的所有网格 for (unsigned int i = 0; i < node->mNumMeshes; i++) { unsigned int meshIndex = node->mMeshes[i]; aiMesh* mesh = scene->mMeshes[meshIndex]; // 处理网格的顶点、法线、纹理坐标等数据 } // 遍历此节点的子节点 for (unsigned int i = 0; i < node->mNumChildren; i++) { TraverseNode(node->mChildren[i], scene); } } ``` 通过上述步骤,可以使用 assimp 加载 glTF 文件,并遍历其中的模型节点和数据。需要注意的是,上述代码只是一个简单的示例,实际项目中可能需要添加更多的逻辑和错误处理来完善功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值