2013-02-26 1 views
4

Как вы находите 3 угла эйлеров между двумя 3D-векторами? Когда у меня есть один Вектор, и я хочу получить его вращение, эта ссылка обычно может использоваться: Calculate rotations to look at a 3D point?

Но как это сделать при расчете их друг относительно друга?Угол Эйлера между двумя векторами 3d

+3

Неверный ваш вопрос. Вам нужно три угла, если вы хотите выровнять два ** опорных кадра **. Если вам нужно только выровнять два вектора, тогда нужны только два угла. – 6502

+0

Как вы вычисляете два угла? И как получилось, что формат файла BVH (http://davedub.co.uk/bvhacker/) имеет 3 угла для перемещения костей? – tomyake

ответ

9

Как уже указывалось другими, ваш вопрос следует пересмотреть. Назовем ваши векторы a и b. Я предполагаю, что length(a)==length(b) > 0, иначе я не могу ответить на вопрос.


Вычислить cross product ваших векторов v = a x b; v указывает ось вращения. Вычислив dot product, вы можете получить косинус угла, вы должны вращаться с cos(angle)=dot(a,b)/(length(a)length(b)), а с acos вы можете однозначно определить угол (@Archie спасибо за указание моей более ранней ошибки). В этот момент у вас есть ось углового представления вашего вращения.

Остальная работа заключается в преобразовании этого представления в представление, которое вы ищете: углы Эйлера. Conversion Axis-Angle to Euler - это способ сделать это, как вы его нашли. Вы должны обрабатывать вырожденный случай, когда v = [ 0, 0, 0], то есть когда угол равен 0 или 180 градусов.


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

+0

Недостаточно перекрестного производства - он не будет различать углы 0 и 180 градусов. Вы должны вычислить как: cross, чтобы получить синус и скаляр, чтобы получить косинус, а затем использовать оба из них для вычисления угла (например, через функцию atan2() в C математической библиотеке). – Archie

+0

Что вы думаете об этом методе: http: //www.euclideanspace.com/maths/geometry/rotations/conversions/angleToEuler/index.htm – tomyake

+0

@Archie Да, правильно, исправлено. На самом деле достаточно точечного продукта и 'acos'. – Ali

1

Сначала вы должны были бы su btract вектор один из вектора два, чтобы получить вектор два относительно векторного. С помощью этих значений вы можете рассчитать углы Эйлера.

Чтобы понять расчет от вектора к Эйлеру интуитивно, представим сферу с радиусом 1 и началом в ее центре. Вектор представляет собой точку на ее поверхности в трехмерных координатах. Эта точка также может быть определена сферическими 2D-координатами: широта и долгота, шаг и рыскание соответственно.

Для «рулет < - шаг < - рыскание» Расчет может быть сделано следующим образом:

Для расчета рыскания вы вычислить тангенс двух плоских осей (х и г) с учетом квадранта.

yaw = atan2(x, z) *180.0/PI; 

Шаг ровный, но поскольку его плоскость вращается вместе с рысканием, «смежный» находится на двух осях. Чтобы найти его длину, нам придется использовать теорему Пифагора.

float padj = sqrt(pow(x, 2) + pow(z, 2)); 
pitch = atan2(padj, y) *180.0/PI; 

Примечание:

  • Ролл не может быть вычислено как вектор не имеет вращения вокруг своей оси. Обычно я устанавливаю его на 0.
  • Длина вашего вектора потеряна и не может быть преобразована обратно.
  • В Эйлере порядок ваших осей имеет значение, смешивайте их, и вы получите разные результаты.
-2

Получение матрицы вращения в MATLAB очень просто например.

A = [1.353553385, 0.200000003, 0.35] 
B = [1 2 3] 

[q] = vrrotvec(A,B) 
Rot_mat = vrrotvec2mat(q)