Предположим, что ваш наблюдатель находится на 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 за указание на то, что он был катастрофически нарушен.