数据结构是对文件的描述,也是我们想要获取的最终产物,一般来说我们会用这个结果映射到我们自己的模型里面去(这样做是为了降低对这个项目的依赖,如果你的模型都用别人的,还搞毛啊)
1.aiScene :根节点
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 :
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 :网格
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 :
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 :动画
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 :节点动画
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 :网格动画
struct aiMeshAnim { C_STRUCT aiString mName; //所有移动的点都会有一个网格帧 unsigned int mNumKeys; C_STRUCT aiMeshKey* mKeys; }; struct aiMeshKey // 网格帧 { double mTime; // 时间 unsigned int mValue; // 值 (这个值没有理解啊) };
7.aiLight :光源
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 :摄像机
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; // 屏幕的宽高比,这个需要获取 };