ASSIMP的数据结构
- 博客分类:
- Assimp
数据结构是对文件的描述,也是我们想要获取的最终产物,一般来说我们会用这个结果映射到我们自己的模型里面去(这样做是为了降低对这个项目的依赖,如果你的模型都用别人的,还搞毛啊)
1.aiScene :根节点
Java代码
- struct aiScene
- {
- unsigned int mFlags; // 一个状态段
- C_STRUCT aiNode* mRootNode; // 根节点
- // 网格
- unsigned int mNumMeshes;
- C_STRUCT aiMesh** mMeshes;
- //材质
- unsigned int mNumMaterials;
- C_STRUCT aiMaterial** mMaterials;
- //动画
- unsigned int mNumAnimations;
- C_STRUCT aiAnimation** mAnimations;
- //纹理
- unsigned int mNumTextures;
- C_STRUCT aiTexture** mTextures;
- //光源
- unsigned int mNumLights;
- C_STRUCT aiLight** mLights;
- //摄像机
- unsigned int mNumCameras;
- C_STRUCT aiCamera** mCameras;
- };
这结构太简洁了。
2.aiNode :
Cpp代码
- struct aiNode
- {
- C_STRUCT aiString mName; // 名字
- C_STRUCT aiMatrix4x4 mTransformation; // 父的相对变换
- C_STRUCT aiNode* mParent; // 父节点
- // 孩纸节点
- unsigned int mNumChildren;
- C_STRUCT aiNode** mChildren;
- // 网格
- unsigned int mNumMeshes;
- unsigned int* mMeshes;
- };
3.aiMesh :网格
Cpp代码
- struct aiMesh
- {
- unsigned int mPrimitiveTypes;
- unsigned int mNumVertices; // 顶点数
- unsigned int mNumFaces; // 面数
- C_STRUCT aiVector3D* mVertices; // 顶点集合
- C_STRUCT aiVector3D* mNormals; // 法向量集合
- C_STRUCT aiVector3D* mTangents; // 切线集合
- C_STRUCT aiVector3D* mBitangents; //双向切线集合
- C_STRUCT aiColor4D* mColors[AI_MAX_NUMBER_OF_COLOR_SETS]; // 顶点颜色集合
- C_STRUCT aiVector3D* mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS]; // 顶点的纹理坐标(u,v)
- unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS];//??
- C_STRUCT aiFace* mFaces; //面的集合
- unsigned int mMaterialIndex; // 材质索引
- C_STRUCT aiString mName; //名字
- // 骨头
- unsigned int mNumBones;
- C_STRUCT aiBone** mBones;
- //动画(这一组参数还未被使用)
- unsigned int mNumAnimMeshes;
- C_STRUCT aiAnimMesh** mAnimMeshes;
- };
4.aiMaterial :材质是一个模板数据结构,材质本身就是N多属性
5.aiTexture :
Java代码
- struct aiTexture
- {
- unsigned int mWidth;
- unsigned int mHeight;
- char achFormatHint[4]; //这个的纹理文件的类型['dds\\0', 'pcx\\0', 'jpg\\0']
- C_STRUCT aiTexel* pcData; //纹理的内容
- };
- struct aiTexel
- {
- unsigned char b,g,r,a; // 四元数描述某个像素的颜色和透明度
- }
6.aiAnimation :动画
Java代码
- struct aiAnimation
- {
- C_STRUCT aiString mName;
- double mDuration;
- double mTicksPerSecond;
- //节点动画集合,骨骼动画属于节点动画
- unsigned int mNumChannels;
- C_STRUCT aiNodeAnim** mChannels;
- //网格动画集合
- unsigned int mNumMeshChannels;
- C_STRUCT aiMeshAnim** mMeshChannels;
- };
6.1 aiNodeAnim :节点动画
Java代码
- struct aiNodeAnim
- {
- C_STRUCT aiString mNodeName;
- //位置的轨迹
- unsigned int mNumPositionKeys;
- C_STRUCT aiVectorKey* mPositionKeys;
- //旋转的轨迹
- unsigned int mNumRotationKeys;
- C_STRUCT aiQuatKey* mRotationKeys;
- //缩放的轨迹
- unsigned int mNumScalingKeys;
- C_STRUCT aiVectorKey* mScalingKeys;
- C_ENUM aiAnimBehaviour mPreState;
- C_ENUM aiAnimBehaviour mPostState;
- };
- struct aiVectorKey //顶点帧
- {
- double mTime; // 时间
- C_STRUCT aiVector3D mValue; // 值
- };
- struct aiQuatKey // 四元数帧
- {
- double mTime; // 时间
- C_STRUCT aiQuaternion mValue; //值
- };
6.2 aiMeshAnim :网格动画
Cpp代码
- struct aiMeshAnim
- {
- C_STRUCT aiString mName;
- //所有移动的点都会有一个网格帧
- unsigned int mNumKeys;
- C_STRUCT aiMeshKey* mKeys;
- };
- struct aiMeshKey // 网格帧
- {
- double mTime; // 时间
- unsigned int mValue; // 值 (这个值没有理解啊)
- };
7.aiLight :光源
Cpp代码
- struct aiLight
- {
- C_STRUCT aiString mName;
- C_ENUM aiLightSourceType mType; // 光源类型 4种
- C_STRUCT aiVector3D mPosition; // 位置
- C_STRUCT aiVector3D mDirection; // 方向
- // 衰减因子,衰减=1/(att0+ ATT1* D+ ATT2* D* D),D是距离
- float mAttenuationConstant; // att0
- float mAttenuationLinear; // ATT1
- float mAttenuationQuadratic; // ATT2
- C_STRUCT aiColor3D mColorDiffuse; // 漫反射光的颜色
- C_STRUCT aiColor3D mColorSpecular; // 镜面光的颜色
- C_STRUCT aiColor3D mColorAmbient; // 环境光的颜色
- // 当光源类型为aiLightSource_SPOT(聚光灯)的时候有效
- float mAngleInnerCone; // 内角弧度
- float mAngleOuterCone; // 外角弧度
- };
- enum aiLightSourceType // 光源的类型
- {
- aiLightSource_UNDEFINED = 0x0, // 全局光
- aiLightSource_DIRECTIONAL = 0x1, // 定向光源,光源的位置无限远
- aiLightSource_POINT = 0x2, // 点光源
- aiLightSource_SPOT = 0x3, // 聚光灯类似的光
- };
8.aiCamera :摄像机
Cpp代码
- struct aiCamera
- {
- C_STRUCT aiString mName; // 名字
- C_STRUCT aiVector3D mPosition; // 相机的位置,默认值0|0|0
- C_STRUCT aiVector3D mUp; // 相机的上方,默认值0| 1 | 0
- C_STRUCT aiVector3D mLookAt; // 视点方向,默认值0|0|1
- float mHorizontalFOV; // 半水平视角的幅度 默认值1/4PI
- float mClipPlaneNear; // 近视截体平面,默认值 0.1f.
- float mClipPlaneFar; // 远视截体平面,默认值是1000.f..
- float mAspect; // 屏幕的宽高比,这个需要获取
- };