我可以将 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 中,实际上 是 一个与此有关的约定。函数 glFrustum
和 glOrtho
是为 eye space 构建的,其中 -z
是观察方向。但是,您可以使用任何您想要的矩阵,从 GL 1.0 开始就可以这样做。 (其他也遵守此约定的函数,如 gluLookAt
、gluPerspective
等,从未 成为 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::perspectiveLH
或 glm::perspectiveLH
。旧的 GL 惯例是使用右手视图 space,但您可以直接创建投影矩阵的“左手”版本。
由于 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 中,实际上 是 一个与此有关的约定。函数 glFrustum
和 glOrtho
是为 eye space 构建的,其中 -z
是观察方向。但是,您可以使用任何您想要的矩阵,从 GL 1.0 开始就可以这样做。 (其他也遵守此约定的函数,如 gluLookAt
、gluPerspective
等,从未 成为 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::perspectiveLH
或 glm::perspectiveLH
。旧的 GL 惯例是使用右手视图 space,但您可以直接创建投影矩阵的“左手”版本。