Разложить 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 ответ

Решение
  1. создать единичную матрицу glLoadIdentity();
  2. повернуть матрицу на glRotatef(-119.718,-0.58064,-0.575698,-0.575699);
  3. получить матрицу для кода на стороне процессора с помощью glGetDoublev
  4. вычислить углы Эйлера из него, используя тригонометрию, чтобы вам нужно

Итак, первые 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);

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

Другие вопросы по тегам