四元数系列:
—————————————————————————————————————————
知乎首文。应@杨智为 的邀请来帮忙贡献一篇文章。
好多年不写文章了,已经不知道该怎么写了,哪里写的不好还请指出(手动害怕
本文是我个人伪原创的一种旋转混合的方法,应该可以算是真·干货。说伪原创是因为我并没有在网上找到有解析解的、顺序无关的、四元数混合方法,但是在弄出来这个方法之后,找到了一个结构相同,但并不是用在四元数上的方法(后面会提到)。所以这篇文章也算是一个可能网上找不到的方法吧。
0. 引言
做骨骼动画的时候,一定会遇到需要混合多个Pose的情况,假如Pose中每个节点的姿态都用一个包含位移、旋转、缩放的Transform来表示,那么多个Transform要如何混合呢?位移和缩放都好说,表示旋转的四元数要如何混合?
我们知道旋转操作所构成的空间非线性,无法对旋转操作直接进行线性叠加。表示旋转的四元数也不能直接简单的线性叠加,并且旋转操作具有不可交换性,交换后结果不同(如下图)。
如果不要求那么高的精度而只是找个看起来凑合的近似解的话,扩展一下对于两个四元数的NLerp操作(Normalized Lerp),直接对多个四元数进行线性叠加然后Normalize一下,在这些四元数所代表的旋转差别不大的情况下,效果也还可以。
那要进行“精确”的混合要怎么做呢?按照顺序对这些四元数依次相乘肯定是不行的,因为四元数乘法顺序相关;用SLerp只能针对两个四元数进行“精确”的混合(这里“精确”指的是角速度匀速的球面插值),但是SLerp没法扩