【问题标题】:glm::perspective vs gluPerspectiveglm::perspective 与 gluPerspective
【发布时间】:2015-07-15 22:26:16
【问题描述】:

我正在用 glm 替换我在项目中使用的 glu 方法,我似乎遇到了一个我无法解释的奇怪差异。当我使用此代码使用 gluPerspective 设置投影矩阵时,我得到了显示:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70.0f, (GLfloat)w / (GLfloat)h, 0.0001f, 1000.0f);

如果我切换到 glm::perspective,我会得到:

glMatrixMode(GL_PROJECTION);
glm::mat4 projectionMatrix = glm::perspective(70.0f, (GLfloat)w / (GLfloat)h, 0.0001f, 1000.0f);
glLoadMatrixf(&projectionMatrix[0][0]);

很明显,我正在渲染的对象现在在 glm 版本中占据了更多的显示空间。除了将 gluPerspective 换成 glm::perspective 之外,这两个版本没有其他变化。

我猜我可能做错了什么,因为我的理解是 glm::perspective 应该是 gluPerspective 的替代品。但目前我不知道那是什么。

另外,方向的不同是因为对象在场景中被旋转。我只是在动画的不同时间截取了屏幕截图。

【问题讨论】:

  • 请注意,如果您仍在使用已弃用的矩阵函数,则使用 glm 并没有太多意义。您应该使用着色器制服。在任何情况下,检查 glm 如何存储它的矩阵,无论它们是存储行优先还是列优先,看看是否匹配 glLoadMatrixf
  • 我也计划放弃弃用的矩阵函数,但是当我遇到这个问题时,我刚开始用 glm 替换弃用的功能。我还需要删除我对过剩的使用。就顺序而言,glm 应该与 GL 使用的相匹配,因为否则使用起来会有点困难。 glLoadMatrix 调用也取自他们的文档。

标签: opengl glm-math


【解决方案1】:

现在的glm默认使用弧度,而gluPerspective()使用度数,所以你必须使用

glm::perspective(glm::radians(70.0f), ...);

得到与gluPerspective(70.0f, ...)相同的结果。

【讨论】:

  • 这就是问题所在——我查看了 gluPerspective 的文档,包括在线文档和 .hpp 文件中的文档,但是这两个地方都指定了 fovy 度数而不是弧度数。我想我会向开发人员发送错误报告。谢谢!
  • 你知道 glm 的最新官方文档在哪里吗?这是我的第一个猜测,但我发现的文档显示它是度数。这看起来可能是一个官方页面:glm.g-truc.net/0.9.6/index.html,它显示了perspective() 的使用以及标题页右侧的度数参数。在 API 参考 (glm.g-truc.net/0.9.6/api/…) 中,它说:“指定在 y 方向上的视场角,以度为单位。以弧度表示。”所以它充其量是模棱两可的......
  • @RetoKoradi:实际上,我不知道任何更新的文档。我发现 glm 文档非常不令人满意。它似乎总是只陈述我可以仅从函数名称中猜到的明显内容。在这种情况下,文档似乎是完全错误的,因为他们不久前决定从度数切换到弧度时它没有更新。
  • 这种变化只是为了绊倒人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2019-11-05
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多