1

我目前正在尝试实现一个带有截锥体的 Camera 类,我可以用它来从场景中剔除对象。为了找到平截头体的边界,我通过PVM 矩阵的逆来变换系统坐标空间(每个边的范围为 [-1..1] 的立方体)。这似乎完美无缺,除了......

当通过逆 PVM 矩阵转换原点 (0, 0, 0, 1) 以进行测试时,我得到 (0, 0, 0, 0 )。在调试时考虑到 PVM 矩阵的特定值,我确切地知道为什么会发生这种情况,但我想知道我是否在逻辑上做错了什么,因为据我所知,欧几里得点应该是 (0, 0, 0) ,而不是由 aw 为 0 产生的一堆 NaN。我在这里忘记了什么?我不应该除以w吗?我的矩阵错了吗?布拉格...

更多细节:

投影矩阵由以下方法定义(在Java中使用LWJGL):

/** fieldOfView is in radians, aspectRatio is simply width / height. */
public static Matrix4f makeProjectionMatrix(Matrix4f dest, float fieldOfView, float aspectRatio, float nearPlane, float farPlane)
{
    float y_scale = GLUtils.cotan(fieldOfView * .5f);
    float x_scale = y_scale / aspectRatio;
    float frustumLength = farPlane - nearPlane;

    dest.setIdentity();
    dest.m00 = x_scale;
    dest.m11 = y_scale;
    dest.m22 = -(farPlane + nearPlane) / frustumLength;
    dest.m23 = -1f;
    dest.m32 = -2f * nearPlane * farPlane / frustumLength;
    dest.m33 = 0f;

    return dest;
}

*基于http://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-opengl-matrix-maths/

请注意,m33 始终为 0,这恰好对我的逆也是正确的(并且我相信对于给定上述公式的所有逆都是正确的)。

由于模型和视图都是单位矩阵,并且投影未从上面修改,因此由PVM 矩阵转换的坐标 (0, 0, 0, x) 将始终产生 0 的 w ... 对吗?

导致困境的示例矩阵:

原始投影:

1.732 0     0  0
0     1.732 0  0
0     0     0 -2
0     0    -1  0

倒投影:

.577 0    0   0
0    .577 0   0
0    0    0  -1
0    0   -.5  0

如果有明显的错误计算,我很乐意发布额外的代码。

4

1 回答 1

1

除了评论:

那么 0 的 az 会产生 0 的 aw,因为这就是您的投影矩阵所说的;)在投影空间中,0 的 az 正好位于投影的原点。它需要在投影前面才能看到。否则,投影中心和顶点位置都占据完全相同的位置。这就是为什么我们有近平面来防止任何 aw 为 0(或接近)的几何体被绘制。

于 2013-02-14T09:15:24.557 回答