最近在看一个GDC影片的时候讲者提到
旋转的 "摆扭解构" (swing-twist decomposition)
只是一语带过,但勾起了我的好奇心,所以就开始研究
研究后觉得算蛮有用的工具,所以就写了一篇文来整理和分享心得
一般从一个旋转渐变到另外一个旋转
是用球线性内插 (slerp, spherical linear interpolation)
数学上的意义是,代表旋转的四元数沿着4D球体表面的最短大圆路径移动
虽然在4D定义上是"最短路径",不过在某些情况下,slerp的效果不是最理想的
例如一个长竿在slerp的时候,两端视觉上并不是沿着3D球体表面的最短大圆路径
理想上两端应该要沿着大圆路径"摆动" (swing),然后本身沿着长轴"扭动" (twist)
这个时候就需要用摆扭解构把旋转分成摆动和扭动两个部分
后两部分各自内插后再组合,就可以达到理想的效果
详细解释(含插图动画)、推导、Unity中的实作和证明,请见:
http://allenchou.net/2018/05/game-math-swing-twist-interpolation-sterp/
[补充]
突然想到另外一个摆扭解构的2D应用
如果把扭动轴选择跟萤幕垂直
那就可以用3D物件的旋转牵动2D要素的旋转或者其他资料
因为解构得到的扭转部分就是3D物件旋转投影到萤幕上的结果
但是就效能而言
不如把物件的一个轴投影到萤幕上
然后找该投影和一个固定2D轴的角度
但摆扭解构又不像投影法一样
有物件轴与萤幕垂直的时候会数值炸掉的缺点