1

给定透视投影矩阵和投影中心,如何推导出投影平面?例如,让我们假设透视投影矩阵是一个 4x4 齐次矩阵:

1 0 0 0
0 1 0 0
0 0 1 0
0 2 0 0

和投影的中心 [0, 0, 0]。从这些数据中可以清楚地看出每个点是如何投影到投影平面中的。但是如何使用这些数据来找到投影平面的精确方程/表示?

4

1 回答 1

2

与“投影中心”(即相机在 3D 场景中的有效位置)不同,在图像投影到的概念平面的意义上,不需要具体的“投影平面”。

相反,投影矩阵确定了到“剪辑空间”的变换,该变换确定了视口边界和深度映射,从中进一步缩放xy偏移坐标以获得目标像素位置。但是,这些都不能转化为场景中的实际平面,该平面以某种方式对应于物理相机的焦平面。

您可以从相机矩阵中导出相关平面:

  • w=0平面,即投影矩阵的第四行。该平面通过投影中心,将相机前面的点与后面的点分开;平面上的任何点都不w=0可见。在您的示例中,该平面为0 2 0 0,即 XZ 坐标平面。

  • z=0平面,即投影矩阵的第三行。结合w=0平面,它决定了深度映射函数和近/远裁剪平面。在您的示例中,该平面为0 0 1 0,即 XY 坐标平面。

相机矩阵的其余行也代表平面:第一行和第二行分别是x=0y=0平面。从某种意义上说,它们根本不像w=0平面那么具体;传统上,它们将剪辑空间(和视锥)分成象限。w=0它们通过对平面坐标求和和差来确定视锥体的水平和垂直边界平面。

x=0“投影中心”是、y=0w=0平面(即投影矩阵的第一行、第二行和第四行)的交点。我应该注意,这表明您的示例是一个非常规的配置:“投影中心”没有明确定义,并且您的所有点都将使用剪辑空间坐标进行映射,例如 ,y/w = 1/2通常是四分之一的水平线屏幕下方。另请注意,通常,z=0平面应平行于w=0平面,仅在无穷远处相交(而不是沿 X 轴,如您的示例中所示)。

近和远裁剪平面是根据图形系统的裁剪空间约定从z=0和平面派生的:w=0

  • OpenGL的深度裁剪是z/w = [near=-1, far=+1]
    • 它的近剪裁平面是上述平面w=0z=0平面的总和(0 2 1 0在您的示例中)
    • 它的远剪辑平面是它们的区别(0 2 -1 0在示例中)
  • DirectX 的深度裁剪是z/w = [near=0, far=-1]
    • 它的近剪裁平面是z=0平面(0 0 1 0在您的示例中)
    • 并且它的远剪辑平面是两者的总和(0 2 1 0在您的示例中,与 OpenGL 近剪辑平面相同)
于 2012-11-20T00:45:29.273 回答