我可以将 OpenGL 相机设置为正 z 轴吗?

Can I set OpenGL camera to look at positive 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, 0, front);

正如您在代码中看到的,为了向前移动相机,我必须将它的 z 位置向后移动,这完全违背了我的直觉。

所以为了处理这个问题,我特意把scale(1, 1, -1)乘到我的视图矩阵上,像

viewMatrix = glm::inverse(GetWorldTransform());
viewMatrix = glm::scale(glm::mat4(1), glm::vec3(1, 1, -1)) * viewMatrix;
pvMatrix = perspectiveMatrix * viewMatrix;

...这不是很漂亮。这样解决这个问题好吗?或者,有什么方法可以将 OpenGL 的相机设置为正 z 方向吗?或者,有没有更漂亮的方法来处理这个问题?

OpenGL 没有相机。它只是呈现发生在剪辑 space 中的查看体积中的任何内容。 “相机”要么是一个完全抽象的心理模型,要么是围绕您在顶部添加的一些转换数学的更高层次的抽象。因此,您完全定义什么是“相机”以及它所看到的位置。

Since OpenGL camera basically looking at negative z direction.

在 OpenGL 1.x 中,实际上 一个与此有关的约定。函数 glFrustumglOrtho 是为 eye space 构建的,其中 -z 是观察方向。但是,您可以使用任何您想要的矩阵,从 GL 1.0 开始就可以这样做。 (其他也遵守此约定的函数,如 gluLookAtgluPerspective 等,从未 成为 OpenGL 的一部分。

Is it okay to solve this problem like this?

嗯,这在数学上是正确的。在你的情况下,你基本上以 P * S * V.

结束

Or, Is there any way to set OpenGL's camera to look at positive z direction? Or, Is there a prettier way to deal with the problem?

有。您可以在 P' = (P * S) 处执行 P' * V 而不是 P * S * V。并且您可以计算 P' 而无需使用比例矩阵进行乘法运算(在这种特殊情况下,无论如何只会翻转第 3 列的符号)。

既然你使用了 glm 库,你可以让 glm 直接为你做 - 由于某种原因,glm 库默认使用旧的 GL 约定,但它不不要强制执行它们。它让您可以选择使用 glm::perspectiveLHglm::perspectiveLH。旧的 GL 惯例是使用右手视图 space,但您可以直接创建投影矩阵的“左手”版本。