Как получить Yaw, Pitch and Roll из трехмерного вектора - PullRequest
13 голосов
/ 06 мая 2010

У меня есть вектор направления, который применяется к позиции, дает мне точку, в которую должна смотреть камера. Как мне получить от этого рыскания, тангажа и крена, чтобы правильно использовать glRotatef?

Заранее спасибо

Ответы [ 4 ]

16 голосов
/ 06 мая 2010

Вы не можете получить рыскание, тангаж и крен от вектора направления, поскольку вектор направления скажет только, в каком направлении смотреть (рыскание и тангаж)

Для получения рыскания и шага вы используете тригонометрию - я предполагаю, что у вас есть некоторые практические знания. Проверьте эту вики-страницу для некоторых полезных диаграмм для визуализации углов.

Допуская Y = рыскание, P = шаг.

Первый, чтобы получить рыскать, вы хотите:

tan(Y) = x/(-y)

Теперь, чтобы получить шаг:

tan(P) = sqrt(x^2 + y^2)/z

Чтобы получить фактические значения для Y и P, вам нужно использовать обратный tan, я написал это выше, используя tan, чтобы сделать вывод более понятным.

Обратите внимание, что знаки минус зависят от того, как вы определяете свои углы и оси, но вы должны понять.

Затем вы можете установить крен равным 0 или как хотите.

13 голосов
/ 19 ноября 2015

Ни одно из этих уравнений не является «неправильным», но все они немного неуклюжи. Ryder052, ваш пример не учитывает определенные случаи, как вы прокомментировали. Почему бы не использовать atan2?

Данный единичный (нормализованный) вектор направления d

pitch = asin(-d.Y);
yaw = atan2(d.X, d.Z)
8 голосов
/ 06 мая 2010

Вы, вероятно, на самом деле не хотите рыскание, тангаж и крен. Вам просто нужно правильное преобразование. Попробуйте использовать gluLookAt для его сборки. Документация .

2 голосов
/ 25 июня 2015

уравнения Феликса неверны. Уважаемые будущие гуглеры, здесь вы узнали, что работает:

Предполагается, что шаг: вращение по оси X, рыскание: вращение по оси Y, крен: вращение по оси Z. Вектор направления V (x, y, z)

pitch = asin(V.y / length(V));
yaw = asin( V.x / (cos(pitch)*length(V)) ); //Beware cos(pitch)==0, catch this exception!
roll = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...