如何在glRotatef中使用glm :: mat4

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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´从4x4矩阵中取出那些但是不太清楚。

可能吗?

答案

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

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

如何从 glm::quat 和 glm::mat4 中提取偏航俯仰滚动

如何从 glm::mat4 读取值

如何使用 glm::mat4 手动正确编写旋转矩阵?

glm::mat4 构造函数如何工作?

GLM:如何转置向量?

在 Opengl 中使用 glm 旋转