繁体   English   中英

派生透视投影平面

[英]Deriving the Perspective Projection plane

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

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

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

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

近剪裁平面和远剪裁平面根据图形系统的剪裁空间约定从z=0w=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
    • 它的远裁剪平面是两者的总和(与 OpenGL 近裁剪平面相同,在您的示例中为0 2 1 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM