Assimp库模型导入结构

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

Class Assimp::Importer

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

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

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

导入支持的常用格式有

  • 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;   //当前不用该参数
	
}

其中:

  • 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;//受这块骨头影响的顶点。
}

Struct aiMaterial

材料的数据结构

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa的迷弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值