OpenGL: glRotate: определение компонента «угол»

#math #opengl

#математика #opengl

Вопрос:

Мне нужна некоторая помощь с математикой и OpenGL.

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

Я думал, что буду получать (x, y, z) первого при каждом его перемещении, а затем отправлять его координаты другой функции, которая должна обновить свойство ‘facing to’ последней. Но как мне найти параметр ‘angle’ для glRotate на основе как нового, так и старого направления объекта-последователя?

Любая помощь высоко ценится. Спасибо, что уделили время.

Комментарии:

1. Такой поворот обычно не уникален. Вы уже знаете ось, вокруг которой хотите повернуть? Потому что тогда это было бы.

2. Для начала неплохо было бы провести вокруг оси y. Можете ли вы показать мне? Но что также требуется сделать вокруг оси x, например?

3. Я опубликовал кое-что для оси Y. Сделать это как для Y, так и для X сложнее, поскольку вам также нужно правильно комбинировать повороты (я предполагаю, что вы хотите поворот по тангажу и рысканию).

Ответ №1:

Давайте предположим, что ваш наблюдатель находится в 0,0,0 и у вас есть старая целевая позиция O и новая целевая позиция N .

Тогда разница в углах вокруг оси Y в радианах равна:

 float angle = atan2(N.z,N.x) - atan2(O.z,O.x);
  

Поскольку glRotate принимает градусы, вы хотите преобразовать это в градусы:

 angle = (angle * 180.f)/M_PI;
  

Как это работает? Вы проецируете оба вектора на плоскость XZ. Я просто игнорирую компонент x для этого. Затем вы берете их угол, соответствующий оси X (это делает arctan), и берете разницу.

Редактировать: Исправлено вычисление угла, спасибо ja72 за указание на то, что оно было катастрофически нарушено.

Комментарии:

1. Разве вы не хотели бы, arctan() чтобы получить угол. Или для этого приложения достаточно приближения небольшого угла?

2. @ja72: A вы правы, это еще даже не угол — я исправлю это как можно скорее.