Блокировка карданного подвеса OpenGL

#opengl

#opengl

Вопрос:

Я нашел пример программы о том, как избежать блокировки карданного подвеса: http://www.mfwweb.com/OpenGL/Special_Rotations/Source.c Мой вопрос в том, как должна выглядеть функция void Render_Scene(void) , если у нас есть более одного объекта, помещенного в вектор или список? Я использовал фрагмент этого кода в своей программе, но вращение не работает. Я знаю, что есть какая-то проблема с матрицами. Вот моя функция paintGL () (я использую qt):

 void GLBox::paintGL()
{

glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

double *trans;
double *rot;
double *matrix;
double ang;
double **vertexes;

//camera
glTranslated(xTrans, yTrans, zTrans);
glRotated(xRot, 1, 0, 0);
glRotated(yRot, 0, 1, 0);
glRotated(zRot, 0, 0, 1);


for(unsigned int i = 0; i < vector_objects.size(); i  )
{
    glPushMatrix();

    trans = (*vector_objects[i]).getTranslation();
    rot = (*vector_objects[i]).getRotation();
    matrix = (*vector_objects[i]).getMatrixRotation();
    vertexes = (*vector_objects[i]).getVertexes_coordinates();
    ang = (*vector_objects[i]).getAngle();

    glTranslated(trans[0], trans[1], trans[2]);

    if (ang != 0.0)
    {
        //glLoadIdentity ();
        glRotatef (ang, rot[0], rot[1], rot[2]);
        glMultMatrixd(matrix);
        glGetDoublev(GL_MODELVIEW_MATRIX, matrix);
    }

    glMultMatrixd(matrix);

    //drawing
    for(int j = 0; j < (*vector_objects[i]).getNumber_of_vertexes(); j  = 3)
    {
        glBegin(GL_TRIANGLES);
        glVertex3dv( vertexes[j]);
        glVertex3dv( vertexes[j   1]);
        glVertex3dv( vertexes[j   2]);
        glEnd();
    }

    glPopMatrix();
}

glFlush();
}
  

Может быть, вы знаете, как исправить эту проблему? Спасибо за помощь

Комментарии:

1. АГА именно от такого неправильного использования OpenGL страдал годами. Пожалуйста, поговорите со мной: OpenGL — это не матричная математическая библиотека. Это дерьмо glGetDouble(GL_*_MATRIX, …); …; glMultMatrix — это очень, очень плохой стиль. В любом случае, оригинальный автор, похоже, понятия не имеет о пространственном преобразовании. Проблема с углами Эйлера и блокировкой подвеса заключается в том, что нет чистого решения этой проблемы с использованием углов Эйлера. Единственное решение заключается не в использовании углов Эйлера, а в обобщенном способе хранения вращений: либо матрицах вращения, либо еще более совершенных четвертинах.

2. Спасибо за подсказку о Quarternions. Я читаю о них прямо сейчас.

3. Хороший пример использования кватернионов для этого можно найти там

4. Хах, вау, я использую OpenGL с момента разработки версии 1.0, и мне ни разу не пришло в голову использовать его в качестве математической библиотеки. Действительно, ужас кодирования.

Ответ №1:

Вы действительно хотите использовать кватернионы для этого. Существует довольно много примеров. Я довольно успешно использовал один из SGI (написанный Гэвином Беллом). Существуют также библиотеки (например, GLM), которые включают подпрограммы для управления ими / использования. Почти в любой приличной книге по основам компьютерной графики найдется по крайней мере глава или две, посвященные вращениям на основе кватернионов.

Комментарии:

1. Спасибо за ваш ответ. Ссылка, которую вы дали, действительно полезна. Большое спасибо.