看了骨骼动画相关知识,写点自己的理解当作笔记。
一边想一边写,比较乱。
每个骨骼动画有一个原点,他能代表整个骨骼动画在世界中的位置。
骨骼:将一个Mesh抽象理解成有许多个部分组成,例如人的肩,大臂,小臂,手等。
骨骼是一个矩阵表示当前骨骼的原点在父矩阵的位置,是抽象存在的。
根矩阵:所用骨骼的最终父节点。通过他统一了说有兄弟骨骼在世界中的位置。
一个骨骼动画其实只有一份Mesh数据。包括所用的顶点,纹理,材质。
既然骨骼动画是一个mesh,那么从Max导出时有一个状态,例如站立,把这个状态作为参考姿势。
在此参考姿势下,每个骨骼都有自己的TransformMatrix矩阵。求出他的逆矩阵(一系列连乘的逆运算),用这个逆矩阵乘以参考姿势下的顶点数据,就得到了Mesh中的顶点在这个骨骼本地坐标中的位置。先把这个逆矩阵叫OffsetMatrix。
OffsetMatrix矩阵和骨骼动画无关,当骨骼进行了一系列变换和父骨骼连乘得出该骨骼对应世界的位置时,就该显示了,在显示蒙皮时需要OffsetMatrix。这样将骨骼本地坐标和Mesh参考姿势下存储的Mesh顶点数据对应起来了。
所有的顶点取自一个Mesh,怎么知道哪一个骨骼对应哪些顶点呢?
X文件中有一个SkinWeights结构,每个骨骼都有,他记录了顶点序号和对应某个骨骼的权重,我想这里可能记录了每个骨骼对应的顶点数据。不知道这里理解的对不对?
最后:
骨骼在世界的位置: Bone TransformMatrix * father TransformMatrix * ..... * Root
骨骼顶点:顶点数据 * 该骨骼的OffsetMatrix * Bone TransformMatrix * father TransformMatrix * ..... * Root
计算权重的顶点:
Vworld = Vmesh * BoneOffsetMatrix1 * CombindMatrix1 * Weight1
+ Vmesh* BoneOffsetMatrix2 * CombinedMatrix2 * Weight2
+ …
+ Vmesh * BoneOffsetMatrixN * CombindMatrixN * WeightN