Graphics 查看平截头体角不是预期的

Graphics 查看平截头体角不是预期的,graphics,geometry,vertex-shader,Graphics,Geometry,Vertex Shader,我正在尝试编写一个方法来计算我正在处理的摄影机类的视锥角。我知道MVP矩阵是正确的,因为它被推到我的顶点着色器中,屏幕上的一切都是正确的,不仅如此,我还从这个矩阵计算了世界空间的平截头体平面,它们是正确的。此外,这些方法在几个不同的摄像机配置中进行了单元测试,并给出了预期的结果 我试图通过将NDC角点转换为MVP矩阵的倒数来计算平截头体角点 // Fill with the corners in clip space. QVector< Vector3f > corners( 8

我正在尝试编写一个方法来计算我正在处理的摄影机类的视锥角。我知道MVP矩阵是正确的,因为它被推到我的顶点着色器中,屏幕上的一切都是正确的,不仅如此,我还从这个矩阵计算了世界空间的平截头体平面,它们是正确的。此外,这些方法在几个不同的摄像机配置中进行了单元测试,并给出了预期的结果

我试图通过将NDC角点转换为MVP矩阵的倒数来计算平截头体角点

//  Fill with the corners in clip space.
QVector< Vector3f > corners( 8 );
corners[0] <<  1.0f,  1.0f,  1.0f;
corners[1] << -1.0f,  1.0f,  1.0f;
corners[2] <<  1.0f, -1.0f,  1.0f;
corners[3] << -1.0f, -1.0f,  1.0f;
corners[4] <<  1.0f,  1.0f, -1.0f;
corners[5] << -1.0f,  1.0f, -1.0f;
corners[6] <<  1.0f, -1.0f, -1.0f;
corners[7] << -1.0f, -1.0f, -1.0f;

//  Then transform back into worldspace.
for ( Vector3f& c : corners ) {
    c = mult( mvp.inverse(), c );
}
这是一台近距为0.8,远距为500.0,视场为35.0°,视口大小为800x600的相机,位于[25.0,12.0,25.0]处,观察原点(
y
为上轴)。我得到这些角落:

-0.988515,  0.00116634, -0.393982
-0.393982,  0.00116634, -0.988515
-0.845201, -0.595974,   -0.250669
-0.250669, -0.595974,   -0.845201

30.2115, 14.9772, 30.8061
30.8061, 14.9772, 30.2115
30.3548, 14.38,   30.9494
30.9494, 14.38,   30.3548

不要盯着数字看太久(你会发疯的),只需注意,在500.0的远平面上,没有相隔数百个单位的角。关于这个过程,我有什么不理解的?

没有仔细看你的数字,我只是胡乱猜测:


我希望您不要忘记在将变换后的角点扩展到4D同质坐标(通过添加
1
)并通过反向MVP将其多重化后,将变换后的角点除以其第四分量


这是必要的,因为MVP矩阵(实际上是投影部分)及其逆矩阵不是仿射变换,因此当应用于齐次向量时,会产生
w
-值,而不是
1
。在变换向量时,当您(或实际上您的着色器)应用通常的前向MVP乘法时,这是相同的,只是固定函数图形硬件为您执行此除法
w
(所谓的透视除法,因为这实际上会导致屏幕上距离较远的对象变小)

“我希望你没有忘记划分你变换的角落……”啊!我得等到回家再检查,但这听起来和问题完全一样。+1
-0.988515,  0.00116634, -0.393982
-0.393982,  0.00116634, -0.988515
-0.845201, -0.595974,   -0.250669
-0.250669, -0.595974,   -0.845201

30.2115, 14.9772, 30.8061
30.8061, 14.9772, 30.2115
30.3548, 14.38,   30.9494
30.9494, 14.38,   30.3548