计算lookAt矩阵不起作用?

时间:2014-02-05 19:43:57

标签: java opengl math matrix shader

我正试图在光照空间中模拟我的场景,作为我的阴影贴图的准备,但是我非常困惑。

计算着色器中位置的线:gl_Position = light_projection_matrix * light_view_matrix * light_model_matrix * position;,其中position是3个浮点数给出的模型坐标(在我的情况下等于世界坐标),我将其读作vec4并且事实证明这一部分正在发挥作用。

现在我使用以Java编码的以下内容作为我的矩阵:

lightModelMatrix.identity().multiply(modelMatrix);
lightViewMatrix.identity().lookAt(new Vector3f(-20f, 7.5f, -20f), Vector3f.O, Vector3f.Y);
lightProjectionMatrix.identity().frustum(-1f, 1f, -1f, 1f, -200f, 200f);

modelMatrixidentity()

的位置

我认为问题是lookAt矩阵正在改变向量的.w组件,我不确定是否应该发生这种情况,我只知道投影矩阵必须计算.w组件。

所以这是我lookAt的代码:

public Matrix4f lookAt(final Vector3f eye, final Vector3f at, final Vector3f up) {
    Vector3f zAxis = at.subtract(eye).normalized();
    Vector3f xAxis = up.cross(zAxis).normalized();
    Vector3f yAxis = zAxis.cross(xAxis);
    return multiply(
        xAxis.getX(),   xAxis.getY(),   xAxis.getZ(),   -xAxis.dot(eye),    //X column
        yAxis.getX(),   yAxis.getY(),   yAxis.getZ(),   -yAxis.dot(eye),    //Y column
        zAxis.getX(),   zAxis.getY(),   zAxis.getZ(),   -zAxis.dot(eye),    //Z column
        0.0f,           0.0f,           0.0f,           1.0f                //W column
    );
}

我的代码中的所有矩阵都按列主要顺序定义。

此外,调试在顶点着色器中计算的gl_Position以查看是否存在问题的好方法是什么?

1 个答案:

答案 0 :(得分:0)

在投影矩阵中,near / far值都应为正值。

在视图矩阵中,zAxis应指向后方(从目标到眼睛),以便(xAxis, yAxis, zAxis)是右手正交基础:

    Vector3f zAxis = eye.subtract(at).normalized();

通过这种修改,该矩阵的其余计算似乎是正确的。作为参考,请参阅this answer以获得“查看”矩阵的完整推导。

  

另外,调试在顶点着色器中计算的gl_Position以查看是否存在问题的好方法是什么?

在此上下文中,最简单的方法是从模型中获取一个顶点(或几个顶点或其边界框),并在软件中应用顶点着色器中完成的变换。然后检查结果以查看它是否有意义(在视锥体内,在正确的距离等处......)。