Я считаю, что правильное решение должно быть следующим:
Назовем эти два угла from
и to
. Я предполагаю, что оба в положительной степени согласно вашему вопросу. Возможны два случая:
- абсолютное расстояние
|to - from|
меньше 180. Это означает, что на to - from
меньше градусов, чем в другом направлении, и , что - это путь, который вам следует выбрать. В этом случае вы должны повернуть на sign(to-from) * deltaRotation
, где sign(x)
= 1, если x> 0, и -1 в противном случае. Чтобы увидеть необходимость функции знака, посмотрите следующие 2 примера, где |to - from|
<180: <ul> - from = 10, to = 20. to - from = 10> 0, поэтому вам следует увеличить поворот.
- от = 20, до = 10. до - от = -10 <0, вы должны <em>уменьшить поворот.
|to - from|
больше 180. В этом случае направление должно быть обратным, и вы должны повернуть на
- sign(to-form) * deltaRotation
, обратите внимание на знак минус. Вы также можете express это как
sign(from-to) * deltaRotation
, поменяв местами
from
и
to
, но я оставил их, как прежде, для ясности.
- from = 310, to = 10. Затем, чтобы - from = -300 <0, вы должны <em>увеличить поворот (Формально -sign (to-from) = -sign (- 300) = - (- 1) = 1)
- from = 10, to = 310. Затем, чтобы - from = 300> 0, вы должны уменьшить поворот (Формально, -sign (to-from) = -sign (300) = -1)
Написав это на C ++, вы можете инкапсулировать этот logi c в такой функции:
int shorterRotationSign(float from, float to) {
if(fabs(to - from) <= 180) {
return to - from > 0 ? 1 : -1;
}
return to - from > 0 ? -1 : 1;
}
Что вы будете использовать следующим образом:
m_Rotation += 5.0f * shorterRotationSign(m_Rotation, m_ProjectedRotation);
m_Rotation = fmod(m_Rotation + 360, 360);
Цель последней строки - нормализовать отрицательные углы и углы больше 360.
(IMO Это больше математического вопроса, чем вопрос об opengl.)