在三维空间里一个点绕X轴 Y轴 Z轴旋转必定弧度后新的点的坐标是容易计算的,问题是若是它所绕的旋转轴是一个任意矢量(x,y,z)的话,怎么知道旋转angle弧度后新的点的坐标呢?函数
在OPENGL里有一个函数glRotatef(angle,x,y,z)能够实现此功能,它的实现是左乘一个矩阵spa
这里假定坐标轴是右手系的(opengl的坐标轴是右手系的,和大学数学教课书里同样),其中 c = cos(angle),s = sin(angle),angle的正负是这样规定的,即在右手系法则里,把大拇指指向矢量方向,其他四指沿逆时针方向天然环绕的角度为正的角度,矢量(x,y,z)必须是已经单位化的且通过原点,这样就可算出:orm
new_x = (x2(1-c)+c) * old_x + (xy(1-c)-zs) * old_y + (xz(1-c)+ys) * old_zblog
new_y = (yx(1-c)+zs) * old_x + (y2(1-c)+c) * old_y + (yz(1-c)-xs) * old_z数学
new_z = (xz(1-c)-ys) * old_x + (yz(1-c)+xs) * old_y + (z2(1-c)+c) * old_zio
(old_x,old_y,old_z)是原来的点的坐标,(new_x,new_y,new_z)是旋转后的新的点的坐标form
这个公式是怎么推导出来的这里不细述,一种方法是经过左乘旋转矩阵M把向量变换为坐标系的一个轴好比z,而后再绕z轴旋转该angle至关于左乘一个矩阵,最后再把向量左乘M的逆矩阵变回去,这一系列的矩阵相乘的结果就是上面的这个矩阵。这个问题困惑我很久了,好比一个矢量绕一个矢量旋转必定角度后获得新的矢量是什么,用它来计算就能够,能够分别计算矢量的起点和终点旋转后获得的新的点的坐标,也就获得了新的矢量。class
Rodrigues' rotation formula能够帮你更容易记住以上结论,揭示了旋转矩阵R与旋转角度θ,旋转轴n之间的关系:扩展
R=cosθ I + (1-cosθ) n n' + sinθ n^nio
其中I是单位矩阵,n=[x y z]'是单位向量,n^=[[0 z -y]' [-z 0 x]' [y -x 0]']是一个对角线元素都为零的反对称矩阵(也叫斜对称矩阵)。
旋转矩阵的另外一种更常见的写法:R=I + sinθ n^ + (1-cosθ) n^ n^
这个与上面的写法是等价的,不信能够展开对比一下。但这个要好记一点吧。