轴角旋转(Axis-Angle Rotation)
上一篇主要是针对
或
坐标系中某一个轴旋转,自然,我们会想到,是否能以任意轴
旋转
,这称之为轴角旋转(Angle-Axis Rotation)。这里,我们可以给出两个结论:
旋转
,都可以分解为沿着三个非平面的轴的旋转
唯一旋转
后获得的方向相同
存在一个全球坐标系下的归一化的向量
,这里
,我们绕
旋转
,可以旋转矩阵为:
这里,
是反对称矩阵(skew-symmetric),存在
,可得:
推导后得到:
例子1:
单位立方体绕通过其角 A 和 G 的直线旋转 π/4。旋转后立方体角的坐标是多少?
这里,
,可得:
因为点G (1,1,1)就在该轴上,无论如何旋转都不应该变化,我们验证一下:
同理,点F (1,0,1)对应的结果:
这样,通过
,如果已知矩阵
,是否可以获取对应的
:
另外,我们还可以通过Euler parameters形式来表达:
这样,可得R:
同样,我们也可以根据矩阵R反推出对应的欧拉参数
,再次不再赘述。
这里,就有疑问了,这种形式有什么好处吗?答案就是四元数和欧拉公式之间的关系。
四元数(Quaternions)
四元数可以认为是复数的延伸:
其中,a是标量部分(scalar),而
是向量部分(vector),当a为零时为纯四元数。
常见的运算规则如下:
根据该运算规则可得Hamilton product:
四元数的共轭(Conjugate)形式是:
,且满足
当空间上的一点
绕单位向量
旋转
对应的四元数表示形式为:
通过欧拉公式对应为:
此时,点p对应一个纯四元数:
旋转后的结果为:
因为
是单位四元数:
例子2:
上图一点
绕着向量
旋转
,旋转后的点
一个没有亲手算过四元数的程序员不能算是一个真正的renderman,当然这个是必要不充分条件,这个问题留给大家自己来算吧。
最后一点,如果存在多次旋转的情况时,比如第一次是
,第二次是
,则有:
至于四元数的优势,一来是只需要四个变量,二来是便于插值计算。另一个好处是避免了欧拉角的万向锁的问题。这个我就不讨论了,因为我从没有遇到过,只是听说过,对此理解不深刻。以我的理解,实际中欧拉角往往都会转为四元数来参与计算。
这一块的数学概念比较多,基于不同的场景各有优略,同时数据计算量比较大,可能视觉体验比较差,但其实用到的数学概念都比较直观,关键在于从几何角度理解其作用,剩下的直接套公式便可以求解。
前两篇主要是基于我的理解,从坐标系到矩阵,从轴角到欧拉参数到最后的四元数这样的方式,将各个知识点之间的关系整合起来,最终确定物体旋转后的orientation,希望这个梳理后的知识体系能够对大家有所帮助。下一篇则介绍平移translation方面的内容。
参考资料(上一篇忘记引入参考资料了):Motion and Manipulation https://www.cs.uu.nl/docs/vakken/moma/2019.html
PS. 微信公众号导入word后,图片压缩的太过分了,对不起我用LaTex敲的公式,我在google drive上共享了pdf原版,有兴趣的可以下载下来看。
drive:https://drive.google.com/drive/folders/1Tp_zDNkY4OuhJ3bagE8qD6N0eX6jU8pm?usp=sharing