基于两个向量创建旋转矩阵

Kev*_*iss 5 math vector rotation matrix

当我传入一个向量(V)时,我希望创建一个旋转矩阵(M),其中M * [0, 0, 1] (forward) = V.

我这样做是因为我然后想使用这个矩阵乘以其他向量以将它们放在本地空间中(不确定这是否是正确的术语,但希望您理解)。

V = [0, 1, 0]
M = ?
Result = M * V = [0, 0, -1]
Run Code Online (Sandbox Code Playgroud)

那么如果乘以 M 后[0,0,1]向上倾斜 90 度变成[0,1,0]...是什么M

Chr*_*ris 5

3D 旋转很难思考,甚至​​更难用文字解释。但是,可以将您的左手形成近似一组三维轴的东西。查看以下描述弗莱明左手规则的维基百科页面;特别是,看看第二张图,其中的手指标记为IBFhttp : //en.wikipedia.org/wiki/Fleming's_left-hand_rule_for_motors

用你自己的手做同样的形状,而不是标记手指IBF,让我们称它们为xyz。此外,我们会说这三个手指在手掌上相交的点是原点,点 (0 0 0),从原点向这些手指/拇指中的一个手指/拇指的尖端移动正方向。

矢量v = (0 1 0) 是沿食指的一个点(我们称之为y)。我们想旋转这个点以形成点 (0 0 -1)。该点位于z轴(拇指)上,但它是负数,因此它位于原点“下方”一个单位,即从拇指尖朝向原点的方向。

因此,要将点 (0 1 0) 旋转为 (0 0 -1),我们需要围绕x轴(您的中指)旋转它。想象一下,将一张光盘放在您的中指上,推动它使其位于由食指和拇指定义的平面(( x , y ) 平面)上,然后在距离光盘中心一个单位的光盘上做一个标记。现在想象用你的食指对齐那个标记,让这个标记位于 (0 1 0) 点。您可以围绕中指旋转圆盘,使标记位于点 (0 0 -1)。因此,所需的旋转是绕x轴旋转。

以下维基百科页面为您提供了围绕xyz轴在三维空间中旋转的方程。绕x轴旋转的矩阵为:

/1     0        0   \
|0   cos ?    -sin ?|
\0   sin ?     cos ?/
Run Code Online (Sandbox Code Playgroud)

如果你用右手旋转圆盘,矩阵被定义为负值 ? 对应于右手的顺时针运动(反之亦然,为正值)。我们需要旋转的角度是负四分之一圈,因此所需的矩阵是:

/1    0     0\
|0    0     1|
\0   -1     0/
Run Code Online (Sandbox Code Playgroud)

请记住,角度可以用度数或弧度表示,因此如果您在代码中实现更一般的旋转,您需要检查您的数学库期望什么。


小智 1

即使是手工操作,也很简单。仅通过检查,就可以看出 M 本质上交换了 y 轴和 z 轴,而只留下 x 轴。

该数组完成以下工作:

    [1  0  0]
M = [0  0  1]
    [0 -1  0]

M * [0, 1, 0] = [0, 0, -1]
Run Code Online (Sandbox Code Playgroud)

请注意,该解决方案在对这两个特定向量具有相同影响的变换矩阵集中不是唯一的。事实上,这样的矩阵有无穷多个。这是一个:

     [sqrt(2)/2     0    sqrt(2)/2]
M2 = [sqrt(2/2)     0   -sqrt(2)/2]
     [0            -1         0   ]
Run Code Online (Sandbox Code Playgroud)