Как использовать glm :: mat4 в glRotatef - PullRequest
0 голосов
/ 25 октября 2018

В современном OpenGL я бы переводил, вращал, масштабировал и т. Д. Вот так:

m_cart.orientation = glm::mat4(glm::mat3(m_cart.T, m_cart.N, m_cart.B));

modelViewMatrixStack.Push();
    modelViewMatrixStack.Translate(m_cart.position);
    modelViewMatrixStack *= m_cart.orientation;
    modelViewMatrixStack.Scale(0.01f);
    m_cart.Render();
modelViewMatrixStack.Pop();

Но теперь по независящим от меня причинам мне приходится использовать какой-то старый OpenGL, и я изменил код начто-то вроде этого:

glPushMatrix();
    glTranslatef(m_cart.position.x, m_cart.position.y, m_cart.position.z);
    glScalef(0.01f, 0.01f, 0.01f);
    m_cart.Render();
glPopMatrix();

Выше это в значительной степени эквивалентно, но я не могу понять, как я могу применить вращение, используя glm::mat4.glRotatef хочет угол и плывет за xyz.Я посмотрел на `glm :: декомпозировать´ , чтобы вывести их из матрицы 4x4, но это не очень понятно.

Возможно ли это?

1 Ответ

0 голосов
/ 26 октября 2018

Вы не можете установить произвольную ориентацию с помощью одного glRotate.вам потребуется до 3 поворотов.
Но вращать матрицу не обязательно, поскольку вы уже знаете конечную матрицу ориентации.Вместо расчета параметров для glRotate вы можете использовать glMultMatrix, который может непосредственно умножить матрицу m_cart.orientation на стек матрицы:

m_cart.orientation = glm::mat4(glm::mat3(m_cart.T, m_cart.N, m_cart.B));

glPushMatrix();
    glTranslatef(m_cart.position.x, m_cart.position.y, m_cart.position.z);
    glMultMatrixf(glm::value_ptr(m_cart.orientation)); 
    glScalef(0.01f, 0.01f, 0.01f);
    m_cart.Render();
glPopMatrix();
...