三维空间里一个点绕矢量旋转后的新的点的坐标

在三维空间里一个点绕X轴 Y轴 Z轴旋转一定弧度后新的点的坐标是容易计算的,问题是如果它所绕的旋转轴是一个任意矢量(x,y,z)的话,怎么知道旋转angle弧度后新的点的坐标呢?

在OPENGL里有一个函数glRotatef(angle,x,y,z)可以实现此功能,它的实现是左乘一个矩阵

这里假定坐标轴是右手系的(opengl的坐标轴是右手系的,和大学数学教课书里一样),其中 c = cos(angle),s = sin(angle),angle的正负是这样规定的,即在右手系法则里,把大拇指指向矢量方向,其余四指沿逆时针方向自然环绕的角度为正的角度,矢量(x,y,z)必须是已经单位化的且经过原点,这样就可算出:

new_x = (xx(1-c)+c) * old_x + (xy(1-c)-zs) * old_y + (xz(1-c)+ys) * old_z

new_y = (yx(1-c)+zs) * old_x + (yy(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 + (zz(1-c)+c) * old_z

其中(old_x,old_y,old_z)是原来的点的坐标,(new_x,new_y,new_z)是旋转后的新的点的坐标

这个公式是怎么推导出来的这里不细述(可以参考罗德里格旋转公式的推导),一种方法是通过左乘旋转矩阵M把向量变换为坐标系的一个轴比如z,然后再绕z轴旋转该angle相当于左乘一个矩阵,最后再把向量左乘M的逆矩阵变回去,这一系列的矩阵相乘的结果就是上面的这个矩阵。这个问题困惑我好久了,比如一个矢量绕一个矢量旋转一定角度后得到新的矢量是什么,用它来计算就可以,可以分别计算矢量的起点和终点旋转后得到的新的点的坐标,也就得到了新的矢量。

Rodrigues' rotation formula可以帮你更容易记住以上结论,揭示了旋转矩阵R与旋转角度θ,旋转轴n之间的关系:

R=cosθ I + (1-cosθ) n n' + sinθ n^

其中I是单位矩阵,n=[x y z]'是单位向量,n^=[[0 z -y]' [-z 0 x]' [y -x 0]']是一个对角线元素都为零的反对称矩阵(也叫斜对称矩阵)。

旋转矩阵的另一种更常见的写法:R=I + sinθ n^ + (1-cosθ) n^ n^

这个与上面的写法是等价的,不信可以展开对比一下。但这个要好记一点吧。

  • 另外使用四元数(Quaternion)来解决该问题,也是一个方便的途径,四元数是Hamilton找到的一种对复数的扩展。已知旋转轴(x,y,z)是单位向量,θ是旋转的角度,(X,Y,Z)是P点的坐标,一个用来执行旋转的四元数q=((x,y,z)sin(θ/2), cos(θ/2)),同时,记q的逆为r,则r=((-x,-y,-z)sin(θ/2), cos(θ/2)),待旋转的点P用四元数表示p=((X,Y,Z),0),旋转后的点P'(X',Y',Z')对应的四元数p'=q*p*r,可以验证p'也是一个虚四元数。关于四元数的乘法可参考Grassmann product
  • 轴角对应的四元数q=cos(θ/2)+sin(θ/2)(xi+yj+zk)

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值