关于使用assimp加载模型时顶点重复的问题

先描述一下问题

将以下模型在blender中打开

统计顶点数为4610,面数为9216

使用以下语句加载模型

Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(path, aiProcess_GenSmoothNormals);

读取assimp数据结构aiMesh中mNumVertices的值为27648

在这个仅有三角形的aiMesh中,mNumVertices为blender中所见面数的三倍,assimp可能默认避免一个顶点被多个面使用

换成使用以下语句加载模型,可改变这一行为

const aiScene* scene = importer.ReadFile(path, aiProcess_GenSmoothNormals | aiProcess_JoinIdenticalVertices);

详见(2012年的古早文档)

Assimp: postprocess.h 文件参考 (sourceforge.net)

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Assimp是一个跨平台的模型导入库,可以用于和处理多种不同格式的3D模型文件。它提供了一套易于使用的API,开发者可以利用这些API来和解析模型文件,并对其中的数据进行访问和操作。 GLTF是一种开放的3D模型文件格式,它可以保存纹理、材质、动画、几何数据等多种信息。Assimp可以通过调用相应的接口来和处理GLTF文件,下面是一个使用AssimpGLTF文件的示例: ```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模型的文件格式。下面是一个用AssimpGLTF文件的例子: 首先,你需要确保已经将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 & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { // 模型失败 return -1; } // 模型成功,进行进一步处理 // ... return 0; } ``` 在上面的例子中,`aiProcess_Triangulate` 和 `aiProcess_FlipUVs` 是一些导入过程的选项,用来将模型的面转换为三角形,并翻转纹理的Y轴。你可以根据需要添其他选项。 成功后,你可以通过访问`scene`对象的属性和方法来处理模型数据。例如,你可以通过访问`scene->mRootNode`来获取模型的根节点,并通过遍历节点树来访问模型的子节点和网格数据。 总结而言,使用AssimpGLTF文件需要引入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 & 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 文件,并遍历其中的模型节点和数据。需要注意的是,上述代码只是一个简单的示例,实际项目中可能需要添更多的逻辑和错误处理来完善功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值