3d геометрия: как выровнять объект по вектору - PullRequest
4 голосов
/ 20 февраля 2010

У меня есть объект в трехмерном пространстве, который я хочу выровнять по вектору.я уже получил Y-вращение, выполнив atan2 на компонентах x и z вектора.но я также хотел бы иметь X-вращение, чтобы объект смотрел вниз или вверх.

представьте плоскость, которая делает свой наклон, просто без вращения.

я используюopenGL, чтобы установить повороты, поэтому мне понадобится угол Y и угол X.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2010

Я бы не использовал углы Эйлера, а скорее ось / угол Эйлера. В этом отношении OpenGL использует glRotate в качестве входных данных.

Если все, что вам нужно, это отобразить вектор на другой вектор, для этого существует бесконечное число поворотов. Для самого короткого (с наименьшим углом поворота) вы можете использовать вектор, найденный по перекрестному произведению ваших векторов from и to.

axis = from X to

отсюда угол поворота можно найти от from.to = cos(theta) (при условии единичных векторов)

theta = arccos(from.to)

glRotate(axis, theta) преобразует from в to.

Но, как я уже сказал, это только один из многих поворотов, которые могут сделать эту работу. Вам нужен полный референс, чтобы лучше определить, как вы хотите сделать преобразование.

3 голосов
/ 20 февраля 2010

Вы должны использовать некую форму кватернионной интерполяции ( Сферическая линейная интерполяция ), чтобы анимировать ваш объект, переходя от его текущей ориентации к этой новой ориентации.

Если вы сохраняете ориентации с использованием кватернионов (математика векторного пространства), то вы можете очень легко получить кратчайший путь между двумя ориентациями. Чтобы прочитать замечательную статью, прочитайте Понимание Slerp, затем не используйте его .

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

1 голос
/ 20 февраля 2010

На самом деле ... взгляните на эту статью. В ней описываются углы Эйлера, которые, как я полагаю, вам и нужны.

...