glm::lookAt 给出了 2D 轴的意外结果

sz *_*ter 2 c++ opengl game-development glm-math

基本上我有一个局部空间,其中 y 指向下方,x 指向右侧,就像

       |
       |
  ---------> +x
       |
       | +y
Run Code Online (Sandbox Code Playgroud)

中心位于 (320, 240),因此左上角为 (0,0)。一些窗口系统使用它。

所以我有这个代码

       |
       |
  ---------> +x
       |
       | +y
Run Code Online (Sandbox Code Playgroud)

我想我需要从 z 的负位置朝正 z 方向查看 (320,240,0),“向上”方向是负 y。

但它似乎没有提供正确的结果

    auto const proj = glm::ortho(0.0f, 640.0f, 0.0f, 480.0f);
    auto const view = glm::lookAt(
        glm::vec3(320.0f, 240.0f, -1.0f),   //eye position
        glm::vec3(320.0f, 240.0f, 0.0f),    //center
        glm::vec3(0.0f, -1.0f, 0.0f)        //up
    );
Run Code Online (Sandbox Code Playgroud)

BDL*_*BDL 5

视图和投影不是这样工作的。视图矩阵告诉您哪个点应映射到视图空间中的 [0,0]。看来您尝试将可见区域的中心映射到 [0,0],但随后您使用的投影矩阵假设 [0,0] 是左上角。

由于您首先应用视图矩阵,因此给出的结果为view * glm::vec4(v, 0.0f, 1.0f) = [0,0]。然后将投影矩阵应用于您将 0,0 定义为左上角的位置,因此proj * [0,0]将得到 [-1,-1]。

我不是 100% 确定你想要实现什么,但是如果你想使用给定的投影矩阵,那么视图矩阵必须以可见区域的左上角点映射到 [ 0,0]。

您还可以调整项目以使用范围 [-320, 320](分别为 [-240, 240]),并使用视图矩阵将中心映射到 [0,0]。