int nbones; //骨骼数 int nanims; //动画数目 int nkeys; //动画关键帧数 int animkeys[MAX_MESHANIMS]; //每个动画的关键帧数 int animkeyspos[MAX_MESHANIMS]; //每个动画关键帧偏移 char animnames[MAX_MESHANIMS][MAX_MESHSTRLEN]; //动画名 char bonenames[MAX_MESHANIMS][MAX_MESHSTRLEN]; //骨骼名 int *nvweights; //顶点受影响的骨骼数 int *vindex; //骨骼权重索引数组,就是指vweight数组中的权重是对应那一块骨骼的权重(骨骼的索引) int *parent; //骨骼的父节点 Vector4 *vweight; //顶点的骨骼权重数组, //这里之所以会搞成一个向量而不是一个float类型的值是因为向量前三个分量表示顶点的位置, //最后一个分量才表示权重值 Matrix4x4 *tm; //骨骼对应帧的变换矩阵 这里存储着每一帧的每一个骨骼的变换矩阵 Matrix4x4 *m; //当前帧的骨骼变换阵 int root; //根骨骼的索引 int nmtl; //材质数 int nverts; //顶点数 int nfaces; //面片数 int* nfacesinpermtl; //每个材质的面片数
从文件里加载骨骼的各种信息
1:加载骨骼的材质数目,这个文件里的三角形划分是按照材质来划分的,材质1对应哪些三角形,材质2对应哪些三角形等
2:顶点数目,骨骼数目,每个顶点的纹理坐标,顶点的基本颜色
3:nvweights数组,数组大小是顶点的数目,数组里存储的是每个顶点受几块骨骼影响,
totweight是把所有顶点的受骨骼影响数目加在一起,vindex是int数组,数组大小为totweight,表示受影响的骨骼索引,vweight数组大小也是totweight,表示对应的权重信息
这里有一点要额外说明的是,这个文件有点奇怪,他没有把顶点的位置信息单独列出来,而是和权重信息放在一起了,所以vweight数组其实不是float类型的数组,而是vector类型的数组,数组中每一个值都是vector向量,该vector前三个表示位置信息,最 后 一个才表示权重信息
int p=0; 这里p主要用来处理vindex和vweight数组的
for(int k=0;k<nverts;k++) { skeltemp[k].u=verts[k].texcoord.X; 纹理坐标 skeltemp[k].v=verts[k].texcoord.Y; skeltemp[k].numOfBone=nvweights[k]; 顶点受几块骨骼影响 for(int n=0;n<nvweights[k];n++,p++) { skeltemp[k].x=vweight[p].X; 位置信息 skeltemp[k].y=vweight[p].Y; skeltemp[k].z=vweight[p].Z; skeltemp[k].weight[n]=vweight[p].W; 权重信息 skeltemp[k].index[n]=vindex[p]; 骨骼的索引 } }
4:骨骼的矩阵信息,这里给出的是每一帧动画,骨骼的矩阵信息,所以有一个很大的矩阵大小为nkey*nbones,我们计算的时候只需要取出那一帧的所有骨骼的矩阵就行了