Поворот объекта на 3 оси в OpenGL - PullRequest
4 голосов
/ 30 августа 2010

Я пытаюсь добиться поворота объекта вокруг 3 осей, увеличивая значения углов поворота для осей и отображая эти оси, чтобы сделать следующее направление вращения предсказуемым для зрителя.Но после нескольких поворотов, только вращение вокруг оси Z выполняется в соответствии с отображаемой осью.Есть ли шанс, что это можно сделать просто, не разбирая кватернионы?

glPushMatrix ();
glRotatef (angleX, 1.0, 0.0, 0.0);
glRotatef (angleY, 0.0, 1.0, 0.0);
glRotatef (angleZ, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex3f(80.0, 0.0, 0.0);   //x axis
glVertex3f(-80.0, 0.0, 0.0);
glVertex3f(0.0, 80.0,  0.0);  //y axis
glVertex3f(0.0, -80.0,  0.0);
glVertex3f( 0.0, 0.0, 80.0);  //z axis
glVertex3f( 0.0, 0.0, -80.0);
//here is some code for drawing arrows at axes ends
glEnd();
glPopMatrix();

Редактировать: У меня есть такие оси: http://img841.imageshack.us/i/arrowsx.jpg/ angleX, angleY, angleZглобальные значения увеличиваются при нажатии клавиши - например, после нажатия клавиши «A» угол X увеличивается на 10, и я ожидаю, что после этого ось X не будет двигаться, а оси Y и Z будут вращаться вокруг оси X. Но это верно только тогда, когда я изменяю только однуугловых переменных.После поворота более чем на одну ось, когда я меняюсь, например, на угол X - все оси на рисунке изменят свое положение

Ответы [ 3 ]

2 голосов
/ 30 августа 2010

Код, который вы опубликовали, сводит все ваши повороты вокруг каждой оси в одно вращение вокруг этой оси. Как вы заметили, это работает хорошо, пока все, что вы делаете, это инкрементные повороты вокруг одной оси. Из вашего обновления также выясняется, что вы хотите, чтобы нажатия клавиш применяли повороты к изображению, как показано, а не в совокупности, как вы закодировали. Один из способов добиться нужного поведения - сохранить в очереди или в векторе с изменяемым размером (std :: vector, или std :: queue или в каком-либо другом контейнере, если вы используете C ++) каждое из примененных вами вращений. Каждый раз, когда пользователь нажимает клавишу, добавьте в список еще одно вращение с фиксированным размером угла вокруг желаемой оси. Во время воспроизведения примените повороты в том порядке, в котором они были введены (возможно, в обратном порядке, мне придется больше об этом думать). Затем будут применены повороты к отображаемой геометрии, а не к канонической (то есть не повернутой) геометрии.

Может быть более простой и менее ресурсоемкий способ сделать это с помощью кватернионов; это та область, в которой мне действительно нужно лучше разбираться. Дайте то, что я знаю прямо сейчас, тем не менее, именно так я и смог бы добиться того поведения, которое, я думаю, вам подходит.

0 голосов
/ 01 сентября 2010

Кватернионы не так сложны.По сути, вы делаете что-то подобное (реализовать класс Quat довольно просто) -

Matrix yawMatrix = Quat(yawAxis, m_rx).matrix();
Matrix pitchMatrix = Quat(pitchAxis, m_ry).matrix();
Matrix rotMatrix = Matrix::multiply(yawMatrix, pitchMatrix);

и применяете матрицу вращения к точке зрения вашей камеры, чтобы вращать ее вокруг целевой точки.

0 голосов
/ 30 августа 2010

Я немного занимался программированием OpenGL в колледже.Похоже, я столкнулся с той же проблемой и в итоге применил общую сумму каждого угла каждый раз, когда обновлялся любой данный угол.

...