|
下面是我对骨骼动画的理解,不知道对不对:
假设有以下数据
数据1: 顶点
struct SVertex
{
顶点位置(3D向量)
};
数据2: 纹理坐标信息
struct SUVInfo
{
顶点0的UV
顶点1的UV
顶点2的UV
};
数据3: 三角形
struct SFace
{
顶点0索引
顶点1索引
顶点2索引
UV纹理坐标索引
};
数据4:骨骼数据
struct SBone
{
父骨骼索引
相对于父骨骼的位置(3D向量)
相对于父骨骼的旋转量(4D向量)
这个骨骼影响的所有顶点信息(一个顶点索引表)
};
文件存储格式可能是这样:
1:顶点数据
2:纹理坐标信息
3:三角形信息
4:N个动画帧,其中每一个动画帧都包含X个骨骼数据
5:每个骨骼对应的一个变长的顶点索引表
然后,下面是游戏里每一帧的计算流程:
首先找到当前帧的骨骼,然后遍历所有骨骼,对每一个骨骼进行如下计算:
1:若该骨骼有父骨骼,则将父骨骼旋转矩阵和自己的矩阵进行相乘,然后找到他所影响的所有顶点,对这些顶点进行变换.
2:若该骨骼还有子骨骼,则遍历子骨骼,直到处理完所有子骨骼.
其中,内存里有一份完整的模型顶点存储区,用来存储被变换后的顶点,然后,三角形索引将使用这些顶点进行光栅化.
另外,这里有个很模糊的一点是,对于骨骼所影响的那些顶点,他们的位置应该是相对于骨骼的吧?
那这样的话,上面提到的第1个顶点数据似乎就没有必要存在了,只需要存储每个骨骼对应哪些顶点就行了.
然后,流星蝴蝶剑里的模型文件,却不是这样,他就有一个原始的顶点数据,就是两臂伸直,直立的造型.
请问,到底应该是什么样子的呢[em24] |
|