计算lookAt矩阵不起作用?

Posted

技术标签:

【中文标题】计算lookAt矩阵不起作用?【英文标题】:Calculating lookAt matrix is not working out? 【发布时间】:2014-02-05 19:43:57 【问题描述】:

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

在我的着色器中计算位置的行:gl_Position = light_projection_matrix * light_view_matrix * light_model_matrix * 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】:

在投影矩阵中,近/远值都应该是正数。

在视图矩阵中,您的zAxis 应该指向后方(从目标到眼睛),因此(xAxis, yAxis, zAxis) 是右手正交基:

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

通过此修改,此矩阵的其余计算似乎正确。有关“查看”矩阵的完整推导,请参阅this answer。

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

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

【讨论】:

试过了,还是不行,需要再调试一下。 将位置传递给片段着色器并将其用作颜色以查看顶点的位置。 (编辑:更偏红色意味着正 x 轴,更偏绿色意味着正 y ......您还可以缩放它以避免负值出现黑色,并且您可以使用模型或世界坐标,具体取决于您要检查的内容) @SebastianHöffner 这种方法假设生成的顶点属于可见图元。在将任何信息传递给片段着色器进行调试之前,您应该真正确保某些内容最终会被光栅化。否则是的,这将是调试gl_Position 的下一步。

以上是关于计算lookAt矩阵不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

使用单位矩阵的坐标不起作用[重复]

使用 arules/apriori 过滤 rhs 不起作用

没有数据矩阵,nbclust 不起作用

OpenGL GLSL - 投影矩阵不起作用

为啥变换矩阵在 OpenGL 中不起作用

在 OpenGL 中使用矩阵——MVP 矩阵不起作用