如何在glRotatef

时间:2018-10-25 20:59:00

标签: c++ opengl glm-math opengl-compat

在现代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::decompose´来将它们从4x4矩阵中删除,但这还不是很清楚。

有可能吗?

1 个答案:

答案 0 :(得分:3)

您不能使用单个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();