如何解决我可以设置 OpenGL 相机以查看正 z 值吗?
由于 OpenGL 相机基本上看负 z 方向,
int front = 0,right = 0;
// Press W and move backward?!
front += glfwGetKey(window,GLFW_KEY_W) == GLFW_PRESS ? -1 : 0;
front += glfwGetKey(window,GLFW_KEY_S) == GLFW_PRESS ? 1 : 0;
// Press D to move right makes sense!
right += glfwGetKey(window,GLFW_KEY_D) == GLFW_PRESS ? 1 : 0;
right += glfwGetKey(window,GLFW_KEY_A) == GLFW_PRESS ? -1 : 0;
Translate(right,front);
正如你在代码中看到的,为了向前移动相机,我必须将它的z位置向后,这完全违背了我的直觉。
所以为了处理这个问题,我特意将scale(1,1,-1)
乘以我的视图矩阵,就像
viewMatrix = glm::inverse(GetWorldTransform());
viewMatrix = glm::scale(glm::mat4(1),glm::vec3(1,-1)) * viewMatrix;
pvMatrix = perspectiveMatrix * viewMatrix;
...这不是很漂亮。像这样解决这个问题可以吗?或者,有没有办法设置 OpenGL 的相机以查看正 z 方向?或者,有没有更漂亮的方法来处理这个问题?
解决方法
OpenGL 没有摄像头。它只是渲染发生在剪辑空间中的视域中的任何事情。 “相机”只是一个完全抽象的心智模型,或者是围绕您添加的一些转换数学的一些更高级别的抽象。因此,您可以完全定义“相机”是什么以及它在哪里看。
因为 OpenGL 相机基本上是在负 z 方向。
在 OpenGL 1.x 中,实际上 有一个与此有关的约定。函数 glFrustum
和 glOrtho
是为 眼睛空间 构建的,其中 -z
是观察方向。但是,您可以使用任何您想要的矩阵,并且从 GL 1.0 开始您就可以这样做了。 (其他也遵守此约定的函数,例如 gluLookAt
、gluPerspective
等,从不 OpenGL 的一部分)。
这样解决这个问题可以吗?
嗯,它在数学上是正确的。就您而言,您基本上以 P * S * V
结束。
或者,有没有办法设置 OpenGL 的相机以查看正 z 方向?或者,有没有更漂亮的方法来处理这个问题?
有。您可以在 P * S * V
处执行 P' * V
,而不是执行 P' = (P * S)
。并且您可以计算 P'
而无需与比例矩阵进行乘法运算(在这种特殊情况下,无论如何它只会翻转第 3 列的符号)。
既然你使用 glm 库,你可以让 glm 直接为你做 - glm 库出于某种原因使用旧的 GL 约定默认,但它不强制执行它们。它让您可以选择使用例如 glm::perspectiveLH
或 glm::perspectiveLH
。旧的 GL 约定是使用右手视图空间,但您可以直接创建投影矩阵的“左手”版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。