如何在 glRotatef 中使用 glm::mat4

Posted

技术标签:

【中文标题】如何在 glRotatef 中使用 glm::mat4【英文标题】:How to use a glm::mat4 in a glRotatef 【发布时间】:2018-10-25 20:59:00 【问题描述】:

在现代 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】:

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

【讨论】:

完美。 glm::value_ptr 在其他场景中恢复到“旧的 openGL”似乎非常有用。干杯。

以上是关于如何在 glRotatef 中使用 glm::mat4的主要内容,如果未能解决你的问题,请参考以下文章

glRotatef() - 如何在多轴上应用旋转?

LWJGL glRotatef 使用多轴

glRotatef 是不是也会旋转法线方向?

如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵

glRotatef 之后 glTranslatef 搞砸了

OpenGL glRotatef