3D Z-Y-X вращение вектора - PullRequest
       28

3D Z-Y-X вращение вектора

1 голос
/ 22 февраля 2011

Я пытаюсь повернуть вектор в 3 измерениях, создавая матрицу вращения из мира в новое вращение.Я делаю вращение, сначала вращаясь вокруг оси Z, затем оси Y и, наконец, оси X, используя правую запись.

Используемая мной матрица находится в Википедии (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 ]

Как видно, это вектор длиной 10 единицвдоль оси X. Я ожидаю, что повернутый результат будет около 6 в поле x, y и z (с z, являющимся отрицательным), поскольку это дает вектор приблизительно длины 10. Т.е. вектор вращается первым точно между миромосей x и y (первое вращение z), а затем наклонены оттуда еще на 45 градусов, заканчиваясь точно между плоскостью xy и отрицательной осью z (второе вращение y). На мой взгляд, это означает три равныхдлинные единичные векторы, представляющие этот вектор.

Однако и мой класс матрицы, и все другие программы дают мне этот вектор как результат:

[  5    ]
[  5    ]
[ -7.07 ]

Кажется правильным, поскольку его длина равна 10ожидается.Итак, вопрос в том, где я ошибаюсь?Я уверен, что делаю какую-то глупую мысленную ошибку где-то очевидную, потому что она точно не имеет трех одинаково длинных рук: p

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Матрица угла поворота ZYX Эйлера определяется как

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

Существует два разных способа определения порядка поворотов: слева направо или справа налево. При чтении слева направо повороты вокруг локальных осей системы координат , как вы правильно делаете . Только при чтении с справа налево вращения происходят вокруг фиксированной системы координат.

Теперь, чтобы ответить на вопрос, давайте вычислим угол, с которым dy вы должны вращаться, если хотите, чтобы все координаты повернутого вектора имели одинаковое абсолютное значение.

Пусть r будет длиной v, а a будет абсолютным значением координаты. По Пифогору, 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 library):

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 голосов
/ 22 февраля 2011

Помните, что второе вращение относительно оси, а не вектора. После вращения в плоскости XY представьте, что вся плоскость закручивается на 45 градусов вокруг оси Y. Это не то же самое, что поворачивать повернутый вектор вверх (то есть вращаться вокруг X = -Y), пока он не окажется под углом 45 градусов к плоскости XY. Трудно объяснить, но я надеюсь, что это поможет: -)

(Правка: правильное направление вращения осей)

...