Разложить glRotatef
У меня есть функция glRotatef с этими параметрами.
glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
Если я сделаю это...
glRotatef(-119.718,-0.58064,0.0,0.0);
glRotatef(-119.718,0.0,-0.575698,0.0);
glRotatef(-119.718,0.0,0.0,-0.575699);
Я не получаю такое же вращение, как при использовании выше. Итак, как мне получить вращение каждого элемента (x, y, z) из этого?
glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
1 ответ
- создать единичную матрицу
glLoadIdentity();
- повернуть матрицу на
glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
- получить матрицу для кода на стороне процессора с помощью
glGetDoublev
- вычислить углы Эйлера из него, используя тригонометрию, чтобы вам нужно
Итак, первые 3 пули просты...
double m[16];
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
glGetDoublev(GL_MODELVIEW_MATRIX,m);
glPopMatrix();
последняя пуля зависит от вашего порядка углов Эйлера и системы координат, а также от чистой математики... Так что либо выведите уравнения для себя (atan2
а также acos
ваши друзья) или Google:
extracting euler angles from rotation matrix
И найдите совпадение, соответствующее вашему заказу... Чтобы реализовать его, вы также должны понимать материал, поэтому смотрите мой:
Также из ОП мне показалось, что ты не понимаешь, как glRotate
работает. В двух словах это вращается вокруг точки (0,0,0)
и произвольный трехмерный вектор в качестве оси. См. Rodrigues_rotation_formula в предыдущей ссылке, но ее можно также реализовать, используя перекрестное и точечное произведение и используя выравнивание по оси вращения.
Теперь вернемся к вашему вопросу после получения углов Эйлера (в предположении порядка ax,ay,az
) тогда само вращение будет выглядеть так:
glRotatef(ax,1.0,0.0,0.0);
glRotatef(ay,0.0,1.0,0.0);
glRotatef(az,0.0,0.0,1.0);
И должно быть сделано в том же порядке, как ваши углы Эйлера...