c++ - 如何在 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 中取出,但不是很清楚。
可能吗?
解决方案
您不能使用单个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();
推荐阅读
- javascript - 如果在检查属性时对象不存在,则返回 undefined
- php - 使用取消链接功能删除图像问题
- c# - 如何正确模拟代表
- c# - 时间:2019-05-10 标签:c#consoleappweb browserTaskCompletionSource停止控制台应用程序
- lighthouse - 在 lighthouse devtools 网络记录中只返回 GET 请求
- php - HTML 表单的 PHP 文件附件和表单验证脚本
- python - 如何在我的 Tkinter 游戏中实现保存系统
- reactjs - 如何使用 react-virtualized 设计可编辑网格
- cassandra - 使用现有安装设置具有 2 个节点的 cassandra 集群
- c - 如何在 C 中使用 libcurl 将 JSON 消息发布到“Https”端点 URL