基于法线旋转矢量

时间:2016-06-26 02:33:26

标签: vector rotation directx rotational-matrices euler-angles

给定左手坐标系中由XZ平面定义的半球表面上的一组点: enter image description here

给定一个定义另一个任意半球的平面的法向量:enter image description here

如何定义一个旋转矩阵,允许我将每个点(矢量)从第一个半球变换到第二个半球的对应点?

如果可能的话,使用N的球面坐标作为旋转角度的旋转矩阵会很方便,$ \ theta $是$ 0 $到$ \ pi $的极角(直观地从Y到 - ) Y)和$ \ phi $是方位角,从$ 0 $到$ 2 \ pi $(从X再回到X通过+ Z,-X,-Z)。

1 个答案:

答案 0 :(得分:0)

构建旋转矩阵的第一步是定义(3)绕单轴旋转的顺序。在你的情况下,有2个角度,2个旋转就足够了(有phi和theta)。

我总是提到this structure from wikipedia 对于phi和theta的使用我可能是错的(关于你的约定),但我尽量清楚

我的个人序列可能是:首先围绕[0,2pi]中的角度phi绕Y轴旋转,以对准" old" X和Z轴到"新的"假设N与Y平行。 然后绕着" new =已经旋转"旋转角度θ。 Z轴带来"新" Y轴沿N.

所以,让我们构建我们的矩阵。围绕Y的旋转具有这种结构(我使用;断开线,R总是3x3)

R_y = [cos(phi) 0 sin(phi); 0 1 0; -sin(phi) 0 cos(phi)]
R_z = [cos(phi) -sin(phi) 0; sin(phi) cos(phi) 0; 0 0 1]

从旧系统到新系统的完整旋转是两个矩阵的乘积,记住哪一个首先出现

R = R_z*R_y

实际上我们想要在旧系统中变换一组3D坐标a,因此它是:

b = R*a = R_z*R_y*a = R_z*(R_y*a)   

并获得新坐标b