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,我们计算的时候只需要取出那一帧的所有骨骼的矩阵就行了