【问题标题】:Deriving the Perspective Projection plane导出透视投影平面
【发布时间】:2012-11-07 05:52:33
【问题描述】:

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

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

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

【问题讨论】:

  • 不应该是右下角的元素总是1吗?

标签: math graphics matrix


【解决方案1】:

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

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

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

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

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

相机矩阵的其余行也代表平面:第一行和第二行分别是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

【讨论】:

  • 感谢comingstorm..你的回答有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多