• Assimp库模型导入结构


    来自:Assimp v3.0(July 2012)官方文档

    Class Assimp::Importer

    用于导入模型,导入的模型存储在aiScene

    使用如下函数可以从外部文件导入

    const aiScene * ReadFile (const char *pFile, unsigned int pFlags)
    
    • 1

    导入支持的常用格式有

    • Autodesk ( .fbx )
    • Collada ( .dae )
    • glTF ( .gltf, .glb )
    • Blender 3D (.blend )
    • 3ds Max 3DS ( .3ds )
    • 3ds Max ASE ( .ase )
    • Wavefront Object (.obj )

    pFlag类型官网:https://assimp.sourceforge.net/lib_html/postprocess_8h.html#a64795260b95f5a4b3f3dc1be4f52e410

    Struct aiScene

    Struct aiScene :数据 以及 统计数据

    主要包含6个数据类型的 数据 以及统计数据注意:只包含统计的数据,而不包含实际的数据),分别为

    • 动画 Animations
    • 摄像机 Cameras
    • 灯光 Lights
    • 材质 Materials
    • 网络 Meshes
    • 纹理 Textures

    记录整个场景中各数据类型存在的数量mNum*,以及各类型数据结构的指针数组(指向m*指针的数组)
    如有aiScene* scene,则存在scene->mNumAnimations,以及其类型的指针数组scene-mAnimations.

    Struct aiScene :标志 以及 结构

    除了统计数据,还包括 标志 以及 结构 数据。

    标志数据:

    • mFlags
      mFlags&AI_SCENE_FLAGS_INCOMPLETE !=0则说明aiScene 资源不完整

    结构数据:

    • aiNode * mRootNode:层次结构的根节点。
    • aiTexture ** mTextures:嵌入纹理的数组。

    通过mRootNode即可得到纹理的层次结构

    Struct aiNode *

    • aiString mName: 节点的名称。
    • unsigned int mNumMeshes: 该节点的网格数。
    • unsigned int * mMeshes: 这个节点的网格。(注:这里记录的是网格的下标
    • unsigned int mNumChildren: 该节点的子节点数。
    • aiNode ** mChildren: 该节点的子节点。
    • aiNode * mParent: 父节点
    • aiMatrix4x4 mTransformation: 相对于节点父节点的转换。

    在程序中输出各值:
    在这里插入图片描述

    Struct aiTexture

    char achFormatHint [4]:来自加载器的提示,使应用程序更容易确定嵌入的压缩纹理的类型。如:“jpg”。
    unsigned int mHeight:纹理的高度,以像素为单位。
    unsigned int mWidth:Width of the texture, in pixels.
    aiTexel * pcData:纹理数据

    Struct aiMesh

    网格表示具有单一材质的几何体或模型。
    它通常由许多顶点和一系列引用顶点的原语/面组成。此外,还可能有一系列的骨骼,每个骨骼都有一定权重的多个顶点。顶点数据在通道中呈现,每个通道包含单个顶点信息,例如一组纹理坐标或一个法向量。如果数据指针不为空,则存在相应的数据流。在c++程序中,您还可以使用Comfort函数Has*()来测试各种数据流的存在。

    一个网格只使用一个材质,这个材质是由材质ID引用的。

    名称 内容
    aiString mName 网格的名称
    aiVector3D * mBitangents 顶点双切线
    aiBone ** mBones 这个网络的骨架
    aiColor4D * mColors [AI_MAX_NUMBER_OF_COLOR_SETS] 顶点颜色集
    aiFace * mFaces 构造网格的
    unsigned int mMaterialIndex 这种网格使用的材料
    aiVector3D * mNormals 法线
    unsigned int mPrimitiveTypes aiPrimitiveType枚举成员的按位组合。
    aiVector3D * mTangents 显示顶点的切线
    aiVector3D * mTextureCoords [AI_MAX_NUMBER_OF_TEXTURECOORDS] 顶点纹理坐标,也称为UV通道。
    aiVector3D * mVertices 顶点位置

    以及各数组的数量

    内部主要数据结构如下:``

    class aiScene{
       
    	//名称
    	aiString mName;
    	
    	//统计信息
    	unsigned int 	mNumAnimMeshes;
    	unsigned int 	mNumBones;
    	unsigned int 	mNumFaces;
    	unsigned int 	mNumVertices;
    	unsigned int 	mPrimitiveTypes;
    
    	//数据指针
    	// 1.顶点信息
    	aiVector3D * 	mVertices;
    	aiVector3D * 	mNormals;
    		//AI_MAX_NUMBER_OF_TEXTURECOORDS = 8
    	unsigned int 	mNumUVComponents [AI_MAX_NUMBER_OF_TEXTURECOORDS];//纹理坐标通道数,1 or 2 or 3。一个顶点最多可以包含8个不同的纹理坐标。
    	aiVector3D * 	mTextureCoords [AI_MAX_NUMBER_OF_TEXTURECOORDS];//纹理坐标UV值
    	aiVector3D * 	mTangents;//纹理U增长的方向
    	aiVector3D * 	mBitangents//纹理V增长的方向
    
    	//2. 骨骼信息
    	aiBone ** 	mBones;
    	
    	// 3. 图元装配信息
    	unsigned int 	mPrimitiveTypes;//顶点连接方式
    	aiFace * 	mFaces;//记录顶点的连接信息
    
    	// 4. 材质信息
    	unsigned int 	mMaterialIndex;
    	
    	// 5.????
    	aiColor4D * 	mColors [AI_MAX_NUMBER_OF_COLOR_SETS];
    	
    	//aiAnimMesh ** 	mAnimMeshes;   //当前不用该参数
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    其中:

    • unsigned int mNumUVComponents [AI_MAX_NUMBER_OF_TEXTURECOORDS];指定给定UV通道的组件数量。最多支持三个通道(UVW,用于访问体积或立方体地图)。如果给定通道n的值为2,则mtexturecords [n][p]的组件p.z被设置为0.0f。如果给定通道的值为1,则p.y也设置为0.0f。@note不支持4D坐标
      在其中程序运行Keqing模型结果为【2,0,0,0,0,0,0,0】
    • aiVector3D * mTextureCoords [AI_MAX_NUMBER_OF_TEXTURECOORDS],其中mesh->mTextureCoords[0]决定是否存在UV;mTextureCoords[0][i].xmTextureCoords[0][i].y则保存UV值。一个顶点最多可以包含8个不同的纹理坐标。 因此,我们假设我们不会使用一个顶点可以有多个纹理坐标的模型,所以我们总是取第一组(0)。
    • enum aiPrimitiveType图元连接方式:
      aiPrimitiveType_POINT ,---------------------1
      aiPrimitiveType_LINE,------------------------2
      aiPrimitiveType_TRIANGLE,----------------4
      aiPrimitiveType_POLYGON,-----------------8

    Struct aiFace

    aiFace只有两个参数

    • unsigned int * mIndices 顶点下标集(可看作VEO数组):指向索引数组的指针。数组的大小在numIndices中给出。
    • unsigned int mNumIndices:数组大小

    使用后处理aiProcess_Triangulate标志,您可以确保aiFace::mNumIndices始终为3。
    使用后处理 aiProcess_SortByPType标志,可以将具有多个基本类型的网格划分为同质子网格。您可以使用AI_CONFIG_PP_SBP_REMOVE选项来指定需要哪些基本类型。

    Struct aiBone

    一个网络对应一个骨骼

    class aiBone 
    {
       
    aiString 	mName;//骨骼名称------与mesh结点
    unsigned int 	mNumWeights;//受此骨骼影响的顶点数,这个成员的最大值是AI_MAX_BONE_WEIGHTS。
    aiMatrix4x4 mOffsetMatrix;//在绑定姿态,从网格空间到骨骼空间的矩阵转换。
    aiVertexWeight * 	mWeights;//受这块骨头影响的顶点。
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Struct aiMaterial

    材料的数据结构

    材料数据使用键值结构存储。单个键值对称为“材料属性”。
    c++用户应该使用aiMaterial提供的成员函数来处理材料属性,C用户必须坚持使用aiMaterialGetXXX家族的未绑定函数。
    库定义了一组标准键(AI_MATKEY_XXX)。

  • 相关阅读:
    flutter开发实战-实现自定义bottomNavigationBar样式awesome_bottom_bar
    MySQL视图
    2024全球数字电影摄像机、相机、广播摄像机市场报告
    Mysql字符集-Mysql进阶(一)
    PHP MySQL 创建数据库
    CMSC5724-关于分类问题、决策树问题以及一个关于误差的通理
    109.firefly-extboot的生成脚本
    OOP 向量加减(友元+拷贝构造)
    (一)JAVA设计模式——设计模式概述
    Use the OverlayFS storage driver
  • 原文地址:https://blog.csdn.net/weixin_44518102/article/details/131130844