任意轴旋转的矩阵表达式
恐怖骑兵团
编辑于 2019年06月21日 12:12
收录于文集
共1篇

已知一个任意轴单位长度的向量r,和绕这个轴旋转的α角度,我们要求一个旋转矩阵X来表示这个旋转过程

首先我们需要求s,t

其中,r,s,t是互相垂直的基向量

首先求s:

  1. 先找到r中的最小分量(绝对值),然后置零.

  2. 交换剩余的两个分量.

  3. 将交换后的第一个不为零的分量取反

  4. 将这个向量标准化一下就求出来s了

怎么求s不重要,可以有其他求法,总之能让r,s,t互相垂直就行了

然后是t:

t=cross(r,s)

现在我们已经把三个基向量已经求出来了

组一个从旋转后的空间到世界空间(令r与世界坐标系的x轴对齐)的矩阵Cp(Child to Parent):

r.x    s.x    t.x

r.y    s.y    t.y

r.z    s.z    t.z

世界坐标系下的旋转坐标系的样子

旋转坐标系下的样子

(当然对齐方式可以自定义,比如让r与y轴对齐,r与z轴对齐,或者r,s,t什么的随便找个轴对齐都可以,不过要注意左右手坐标系的对应关系)

现在从世界坐标系到旋转坐标系的矩阵表达式M就是Cp取逆,不过因为Cp是由基向量组合起来的,所以求逆非常简单,Cp转置一下就是了

M=Transpose(Cp)

现在,向量x的旋转就可以很好的表达了:

先将x变换到旋转后的坐标系下,然后在这个坐标系下完成旋转操作,随后再将这个旋转坐标系下的向量x再变换到世界坐标系...

变换过程

表达式为:

X=Cp*Rx(α)*M

x'=X*x

(Rx(α)是绕x轴的旋转矩阵,因为使用的是x轴对齐方式)

把这些数带入这个表达式就求出X了

X表达式

参考资料:

Realtime Rendering 4th, 4.2.4:Rotation about an Arbitrary Axis, Page 74