【问题标题】:Calculating lookat matrix using in vertex shader OpenGL 3.x使用顶点着色器 OpenGL 3.x 计算观察矩阵
【发布时间】:2012-09-11 06:37:56
【问题描述】:

我按照这篇文章构建了 GluLookAt 类型矩阵。

Calculating a LookAt matrix

            Method calculateLookAtMatrix(glm::vec3 eye, glm::vec3 center, glm::vec3 up)

    glm::vec3 zaxis = glm::normalize(center - eye);
    glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis));
    glm::vec3 yaxis = glm::cross(zaxis, xaxis);

    lookAtMatrix[0][0] = xaxis.x;
    lookAtMatrix[0][1] = yaxis.x;
    lookAtMatrix[0][2] = zaxis.x;

    lookAtMatrix[1][0] = xaxis.y;
    lookAtMatrix[1][1] = yaxis.y;
    lookAtMatrix[1][2] = zaxis.y;

    lookAtMatrix[2][0] = xaxis.z;
    lookAtMatrix[2][1] = yaxis.z;
    lookAtMatrix[2][2] = zaxis.z;

    lookAtMatrix[3][0] = glm::dot(xaxis, -eye);
    lookAtMatrix[3][1] = glm::dot(yaxis, -eye);
    lookAtMatrix[3][2] = glm::dot(zaxis, -eye);

    lookAtMatrix[3][3] = 1;

我计算那个 CPU 端,并以与透视矩阵相同的方式将其作为统一传递给着色器。

着色器看起来像这样。

 gl_Position =   lookAtMatrix * position * perspectiveMatrix;

如果将lookAtMatrix 作为单位矩阵传入,则场景渲染正确,但是使用上面的代码将矩阵设置为...

    eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

导致空白场景。场景是在 X/Y 上绘制的 10x10 网格,因此我一直期待场景的缩小视图。

(我已经玩过行和列,但我 99.9% 确信它们很好,因为透视矩阵很好)

【问题讨论】:

    标签: c++ opengl matrix glsl glm-math


    【解决方案1】:
    gl_Position =   lookAtMatrix * position * perspectiveMatrix;
    

    这是不正确的。您想通过lookAtMatrix 转换您的位置,然后通过perspectiveMatrix 转换结果。

    当使用列向量/列主向量和矩阵时,您希望通过将向量放在矩阵的右侧来将矩阵和向量相乘。

    所以你的乘法最终应该是这样的:

    gl_Position =   perspectiveMatrix * lookAtMatrix * position;
    

    话虽如此,但我不知道你为什么一开始就在左边,所以我想知道你是否在管道的某个地方做一些矩阵转置。如果此解决方案不起作用,您可能需要显示更多代码。

    【讨论】:

      【解决方案2】:
      eye(0.0f,0.0f,10.0f);
      center(0.0f,0.0f,0.0f);
      up(0.0f,0.0f,1.0f);
      

      up 矢量方向平行于观察方向。这是不允许的。

      请记住:向上方向定义了“向上”对视图的含义。它定义了围绕观察方向的旋转。如果向上方向观察方向,则数学不再适用。

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多