骨骼系统的深入理解和对比
骨骼系统的理解
- 这里的骨骼的确是借鉴了现实中的骨骼,两者有相似之处,但是很多地方具有天壤之别,可以作为理解的辅助,但不能将现实的骨骼和这里的骨骼等效
- 骨骼的本质:一个假想出来不存在的物体,和一些顶点成比例的关联,作用在骨骼上的矩阵变换会以一定权重反映到关联的顶点上
- 具体顶点的变换原则:唯一变换直接照搬骨骼,关键是旋转,旋转中心点一定是位移变换后的骨骼中心点,因此骨骼的位置会影响形变的结果
- 动作数据的缩放其实都是作用在位移参数上的,只要骨架和模型的位置对好,旋转和缩放是不会出问题的
- 骨骼存在父子级关系,通常情况下符合正向动力学,即FK
- 建立反向动力学IK后,关联骨骼的变换将被限制
Blender与Three.js中骨骼系统的对比
- 骨骼与顶点关系数据的存储方式:
- Blender以骨骼为索引,通过顶点组(叫顶点组,但不单是顶点的集合,还包含的顶点的权重数据)建立联系
- Three.js以顶点为索引,给顶点一个四维向量属性来指定最多和四根骨骼的对应关系
- 骨骼的形态与属性:
- Blender中的骨骼更像是现实中的骨骼,是一根一根的,有粗细,有旋转,有首尾,甚至顶端球都有半径设定。但是很多数据其实是冗余的,如果不采用骨骼封套模式的话,尾端其实只起到一个指定方向的作用,距离头部的距离什么的不会对形变效果产生影响
- Three.js中的骨骼基本上就是一个什么都没有的空对象,具有变换矩阵的数据,换句话说就是有缩放,位置,旋转数据
- 骨架和物体的绑定操作:
- Blender中通过创建一个骨架修改器来实现形变,有时候会将一个物体作为骨架对象的一个后代,自动分配顶点组和权重的时候其实进行的就是父子级关联的操作
- Three.js中创建SkinnedMesh,创建实例时就关联了几何体数据,然后绑定骨架来实现模型和骨骼的绑定
- 骨骼绑定的模式:
- Blender除了顶点组与同名骨骼绑定以外,还有一种方式叫做骨骼封套
- Three.js没有其他奇妙的绑定模式
- 默认姿态的实现:
- Blender有一个编辑模式,进入该模式后显示的就是骨骼的静置状态,在Blender中,骨骼的静置参数和姿态参数是完全分开的。姿态参数和Three.js中所有状态下骨骼的参数更接近
- Three.js中的骨骼完全没有这样的两种状态,他有的只是变换矩阵的参数。关于那个静置状态的指定,是在执行
SkinnedMesh.bind
时,获取骨骼当时的状态直接作为静置状态,存储为变换逆矩阵。不过也可以在bind函数里传参自己给定静置状态中所有骨骼的变换逆矩阵
- 带骨骼物体和其他物体的关系:
- Blender中有骨骼的物体和其他物体没什么两样,就是多了个修改器
- Three.js中带骨骼的模型全部都是有一个不同于其他模型的类型,SkinnedMesh来实现的
- Blender中的顶点和Three.js不是一个概念