用于导入模型,导入的模型存储在aiScene
中
使用如下函数可以从外部文件导入
const aiScene * ReadFile (const char *pFile, unsigned int pFlags)
导入支持的常用格式有
pFlag类型官网:https://assimp.sourceforge.net/lib_html/postprocess_8h.html#a64795260b95f5a4b3f3dc1be4f52e410
主要包含6个数据类型的 数据 以及统计数据(注意:只包含统计的数据,而不包含实际的数据),分别为
记录整个场景中各数据类型存在的数量mNum*
,以及各类型数据结构的指针数组(指向m*
指针的数组)
如有aiScene* scene
,则存在scene->mNumAnimations
,以及其类型的指针数组scene-mAnimations
.
除了统计数据,还包括 标志 以及 结构 数据。
标志数据:
mFlags&AI_SCENE_FLAGS_INCOMPLETE !=0
则说明aiScene 资源不完整结构数据:
aiNode * mRootNode
:层次结构的根节点。aiTexture ** mTextures
:嵌入纹理的数组。通过mRootNode
即可得到纹理的层次结构
aiString mName
: 节点的名称。unsigned int mNumMeshes
: 该节点的网格数。unsigned int * mMeshes
: 这个节点的网格。(注:这里记录的是网格的下标)unsigned int mNumChildren
: 该节点的子节点数。aiNode ** mChildren
: 该节点的子节点。aiNode * mParent
: 父节点aiMatrix4x4 mTransformation
: 相对于节点父节点的转换。在程序中输出各值:
char achFormatHint [4]
:来自加载器的提示,使应用程序更容易确定嵌入的压缩纹理的类型。如:“jpg”。
unsigned int mHeight
:纹理的高度,以像素为单位。
unsigned int mWidth
:Width of the texture, in pixels.
aiTexel * pcData
:纹理数据
网格表示具有单一材质的几何体或模型。
它通常由许多顶点和一系列引用顶点的原语/面组成。此外,还可能有一系列的骨骼,每个骨骼都有一定权重的多个顶点。顶点数据在通道中呈现,每个通道包含单个顶点信息,例如一组纹理坐标或一个法向量。如果数据指针不为空,则存在相应的数据流。在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].x
,mTextureCoords[0][i].y
则保存UV值。一个顶点最多可以包含8个不同的纹理坐标。 因此,我们假设我们不会使用一个顶点可以有多个纹理坐标的模型,所以我们总是取第一组(0)。enum aiPrimitiveType
图元连接方式:aiFace
只有两个参数
unsigned int * mIndices
顶点下标集(可看作VEO数组):指向索引数组的指针。数组的大小在numIndices中给出。unsigned int mNumIndices
:数组大小使用后处理aiProcess_Triangulate
标志,您可以确保aiFace::mNumIndices
始终为3。
使用后处理 aiProcess_SortByPType
标志,可以将具有多个基本类型的网格划分为同质子网格。您可以使用AI_CONFIG_PP_SBP_REMOVE
选项来指定需要哪些基本类型。
一个网络对应一个骨骼
class aiBone
{
aiString mName;//骨骼名称------与mesh结点
unsigned int mNumWeights;//受此骨骼影响的顶点数,这个成员的最大值是AI_MAX_BONE_WEIGHTS。
aiMatrix4x4 mOffsetMatrix;//在绑定姿态,从网格空间到骨骼空间的矩阵转换。
aiVertexWeight * mWeights;//受这块骨头影响的顶点。
}
材料的数据结构
材料数据使用键值结构存储。单个键值对称为“材料属性”。
c++用户应该使用aiMaterial提供的成员函数来处理材料属性,C用户必须坚持使用aiMaterialGetXXX
家族的未绑定函数。
库定义了一组标准键(AI_MATKEY_XXX
)。