我目前正在尝试实现一个带有截锥体的 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;
}
请注意,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
如果有明显的错误计算,我很乐意发布额外的代码。