
已知一个任意轴单位长度的向量r,和绕这个轴旋转的α角度,我们要求一个旋转矩阵X来表示这个旋转过程
首先我们需要求s,t
其中,r,s,t是互相垂直的基向量
首先求s:
先找到r中的最小分量(绝对值),然后置零.
交换剩余的两个分量.
将交换后的第一个不为零的分量取反
将这个向量标准化一下就求出来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