2011-02-22 145 views
1

我试图通过从世界到新的旋转创建一个旋转矩阵来在3维空间中旋转矢量。我首先围绕Z轴旋转,然后使用右手符号旋转Y轴,最后旋转X轴。矢量的3D Z-Y-X旋转

我使用的矩阵可以在wikipedia上找到(http://en.wikipedia.org/wiki/Euler_angles)。它位于转换矩阵列表中略低于页面中间的位置。我正在使用ZYX之一: enter image description here

我现在使用Z旋转+45度,Y旋转+45度并且没有X旋转来创建它。这使我下面的矩阵:

[ 0.5 -0.707 0.5 ] 
[ 0.5 0.707 0.5 ] 
[ -0.707 0.0 0.707 ] 

现在我由以下矢量相乘:

[ 10 ] 
[ 0 ] 
[ 0 ] 

如可以看到它的沿x轴的10个单位长的矢量。我期望旋转的结​​果在x,y和z字段(z为负)的旋转结果大约为6,因为这给出了大致长度为10的矢量。即,矢量首先精确地在世界x和y轴之间旋转(第一个z旋转),然后再从那里向下倾斜45度,结束于xy平面和负z轴之间(第二个y旋转)。在我看来,这意味着代表这个向量的三个同样长的单位向量。

然而,我的两个矩阵类和所有其他程序给我这个向量作为结果:

[ 5 ] 
[ 5 ] 
[ -7.07 ] 

似乎正确的,因为它的长度为10的预期。所以问题是我错在哪里?我敢肯定,我在做一些愚蠢的错误思想的地方明显,因为它肯定不具备三个平行相等的长胳膊:对

回答

1

的ZYX欧拉角度旋转矩阵被定义为

R_ZYX(dz, dy, dx) = R(Z, dz) * R(Y, dy) * R(X, dx) 

有是阅读旋转顺序的两种不同方式:从左到右或从右到左。当从左至右旋转阅读是有关坐标系的局部坐标轴,因为你是做正确。从向右读向左时,这是唯一的旋转是绕固定坐标系。

现在回答这个问题,让我们来计算dy应该用,如果你想在矢量旋转的所有坐标有相同的绝对值旋转角度。

rv的长度并且让a为绝对坐标值。由Pythogoras,a^2 + a^2 + a^2 = r^2,因此a = r/sqrt(3)。旋转矢量相对于XY平面的角度为dy = asin(a/r) = asin(1/sqrt(3)),其大约为35.3度。此角度与您当前使用的45度(或弧度为asin(1/sqrt(2)))不同。

(使用Python和gameobjects库)的测试:

from gameobjects import * 
from math import * 
import random 

V = vector3.Vector3 
T = matrix44.Matrix44 

def R_x(dx): return T.x_rotation(dx) 
def R_y(dy): return T.y_rotation(dy) 
def R_z(dz): return T.z_rotation(dz) 

def fmt(v): return "(%.3f, %.3f, %.3f)" % (v[0], v[1], v[2]) 

dx = 0 
dy = asin(1/sqrt(3.0)) 
dz = pi/4 

v = V(10, 0, 0) 

print "ZYX Euler angle transformations:" 
print fmt((R_z(dz) * R_y(dy) * R_x(dx)).transform(v)) 
dy = pi/4 
print fmt((R_z(dz) * R_y(dy) * R_x(dx)).transform(v)) 

输出:

ZYX Euler angle transformations: 
(5.774, 5.774, -5.774) 
(5.000, 5.000, -7.071) 

dz = dy = pi/4最后一行显示,该方案与欧拉角实现一致。

+0

好吧,这么说我想先旋转我的系统在x-y平面45度,然后在新旋转的系统中围绕y轴绘制一个圆(例如半径为10个单位)。我希望它分成359个同样长的部分(计算360点)。就我所知,使用这个矩阵,如果我让y-旋转角度以每个点1度增长,那么这些分段在圆的所有部分中的长度将不会相等。我将如何继续这样做?可以这么说,对我来说重要的财产是这个角度对计算点有利。 – DaedalusAlpha 2011-02-23 09:03:47

0

记住第二旋转相对于轴,而不是载体。在XY平面内旋转后,想象整个平面围绕Y轴扭转45度。这与将旋转的矢量直线向上旋转(即绕X = -Y旋转)直到它与XY平面成45度角并不相同。很难解释,但我希望帮助:-)

(编辑:得到了全面轴正道)