2013-03-26 116 views
3

我期待创建一个旋转矩阵(M),当我通过向量(V)M * [0, 0, 1] (forward) = V创建一个基于两个向量的旋转矩阵

我这样做是因为我想用这个矩阵来乘其他向量,把它们放在本地空间(不知道这是否是正确的术语,但希望你能理解)。

V = [0, 1, 0] 
M = ? 
Result = M * V = [0, 0, -1] 

所以,如果[0,0,1]已经投了90度向上乘以由M后成为[0,1,0] ...什么是M

+0

相关问题:http://stackoverflow.com/q/15618304/380384 – ja72 2013-03-27 02:09:47

+0

旋转矩阵的列对应于局部x,y,z轴的分量。 – ja72 2013-03-27 02:11:17

回答

1

即使手工,容易,peasy。仅仅通过检查,就可以看到M基本上交换了y轴和z轴,只剩下x个。

这个数组做这项工作:

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

M * [0, 1, 0] = [0, 0, -1] 

注意,这个解决方案不是一套有关于这两个特定的载体相同的影响变换矩阵中是唯一的。事实上,这样的矩阵有很多种。这里是一个:

 [sqrt(2)/2  0 sqrt(2)/2] 
M2 = [sqrt(2/2)  0 -sqrt(2)/2] 
    [0   -1   0 ] 
+1

值得指出的是,尽管有无限多的将(0 1 0)映射到(0 0 -1)的变换矩阵,但并不是所有矩阵都是旋转矩阵。此外,在旋转矩阵的旋转矩阵中,所执行的旋转必须是绕y轴和z轴的整个匝数的自然数,以及围绕x轴的整个匝数的自然数加上四分之一圈(在适当的方向上)围绕x轴。 – Chris 2013-03-26 23:28:24

4

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

使同一地层用自己的手,而不是手指标注˚F,我们姑且称之为Xÿž。此外,我们会说,这三个手指在手掌相交处的位置是原点,(0 0 0),并且从原点移动到这些手指/拇指中的一个的尖端正在移动积极的方向。

矢量v =(0 1 0)是你的食指点(我们已经叫Ÿ)。我们想旋转这个点来形成点(0 0 -1)。这一点位于轴(拇指)上,但是它是负的,所以它位于原点“下方”的一个单位,从拇指尖到原点的方向。因此,要将点(0 1 0)旋转到(0 0 -1),我们需要围绕轴(您的中指)旋转该点(012)。想象一下,将一张光盘放在你的中指上,推动它,使它位于食指和拇指所定义的平面上 - (x,)平面 - 并在光盘上放一个标记中央。现在想象用食指对齐该标记,以便标记位于该点(0 1 0)。您可以绕中指旋转光盘,使标记位于(0 0 -1)点。所以,所需的旋转是围绕着轴的旋转。

以下维基百科页面为您提供了rotations in three-dimensional space around the x, y, and z axes的等式。周围的X轴旋转的矩阵是:

/1  0  0 \ 
|0 cos θ -sin θ| 
\0 sin θ  cos θ/ 

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

/1 0  0\ 
|0 0  1| 
\0 -1  0/ 

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

0

所以您将得到一个当地ž - 轴V=(vx,vy,vz)和本地XU=(ux,uy,uz),其中UV单元载体 - 轴:

当地Ÿ - 轴是W=Normalized(Cross(V,U)) 。现在,如果U不是精确地垂直于V它需要与U=Normalized(Cross(W,V))

的3×3旋转矩阵来校正是

| Ux Wx Vx | 
M = | Uy Wy Vy | 
    | Uz Wz Vz | 

注意Cross(A,B) = (Ay*Bz-Az*By, Az*Bx-Ax*Bz, Ax*By-Ay*Bz)是叉积运算符和Normalized(A) = (Ax,Ay,Az)/SQRT(Ax*Ax+Ay*Ay+Az*Az)创建一个单位矢量。

相关问题