Разложить glRotatef - PullRequest
       23

Разложить glRotatef

0 голосов
/ 10 ноября 2018

У меня есть функция 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 Ответ

0 голосов
/ 10 ноября 2018
  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);

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

...