OpenGL:除以w为零

时间:2013-02-14 00:08:21

标签: java opengl matrix lwjgl

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

当通过反PVM矩阵变换原点(0,0,0,1)以进行测试时,我得到(0,0,0, 0 )。我知道为什么在调试时给出了PVM矩阵的特定值,但是我想知道我是否在逻辑上做错了什么,因为据我所知,欧几里得点应该是(0,0,0) ,而不是由0的aw产生的一堆NaN。我忘记了什么?我不应该被w分开吗?我的矩阵是错的吗? Blargh ...

更多详情:

投影矩阵由以下方法定义(在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,对于我的反转也是如此(并且我相信在给定上述公式的情况下所有反转都是正确的。)

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

导致困境的示例矩阵:

原始投影:

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

如果计算错误,我会很乐意发布其他代码。

1 个答案:

答案 0 :(得分:1)

继续评论:

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