首页 > 解决方案 > 如何在 glRotatef 中使用 glm::mat4

问题描述

在现代 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'以将它们从 4x4matrix 中取出,但不是很清楚。

可能吗?

标签: c++openglglm-mathopengl-compat

解决方案


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

推荐阅读