Как повернуть исходный вектор к цели (к ближайшему вектору), используя только 2 угла Эйлера - PullRequest
0 голосов
/ 23 марта 2019

Мне нужно повернуть исходный трехмерный вектор к целевому вектору, вращая его только вокруг двух осей YZ.

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

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

Мне нужно выровнять только ориентацию, а не координаты.

Как лучше всего это сделать с помощью матриц вращения, кватернионов и т. Д.?

Я могу рассчитать shorttestArcQuat от исходного вектора к цели. Затем умножьте целевой вектор на обратную величину этого квата. А затем получить углы YZ из матрицы вращения с результатом операции prev в качестве вектора Z, но я думаю, что это неправильно.

Решение должно быть аналитическим.

1 Ответ

0 голосов
/ 23 марта 2019

Для ясности в обозначениях позвольте мне определить единичные векторы

E1 = (1,0,0)
E2 = (0,1,0)
E3 = (0,0,1)

Учитывая матрицу вращения R, цель состоит в том, чтобы разложить ее на две матрицы вращения, поворачивая угол "a" вокруг оси E2 и угол "b" вокруг оси E3:

R = exp(a E2) exp(b E3)

Умножение обеих сторон на E3

R E3 = exp(a E2) exp(b E3) E3

Получаем:

W = exp(a E2) E3

Где W - вектор E3, повернутый на R: W = R E3

a = atan2( W • E1, W • E3)

Где (•) - скалярное произведение.

Теперь, взяв транспонирование R, мы получим:

R^T = exp(b E3)^T exp(a E2)^T

Умножение обеих сторон на E2:

R^T E2 = exp(b E3)^T exp(a E2)^T E2

R^T E2 = exp(-b E3) exp(-a E2) E2

S = exp(-b E3) E2

где S - вектор E2, повернутый на R ^ T: S = R ^ T E2

b = - atan2( S • E1, S • E2)

Я только что вывел эти уравнения, так что это не проверено, и может быть какая-то ошибка. Прими это как есть.

...