【问题标题】:Projecting a 3D point to 2D screen space using a perspective camera matrix使用透视相机矩阵将 3D 点投影到 2D 屏幕空间
【发布时间】:2010-09-08 17:26:24
【问题描述】:

我正在尝试使用透视相机矩阵将一系列 3D 点投影到屏幕上。我没有世界空间(或认为它是一个单位矩阵)并且我的相机没有相机空间(或认为它是一个单位矩阵),我的对象空间确实有一个 4x4 矩阵。

我正在获取对象矩阵并将其乘以相机透视矩阵,使用以下方法生成:

Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far )
{
    Float fov2 = (fov/2) * (Math.PI/180);
    Float tan = Math.tan(fov2);
    Float f = 1 / tan;

    return new Matrix4 ( 
        f/aspect, 0, 0, 0,
        0, f, 0, 0,
        0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far),
        0, 0, 1, 0 
    );
}

然后我将我的观点 [x, y, z, 1] 乘以透视矩阵和对象矩阵的乘积。

下一部分是我感到困惑的地方,我很确定我需要在 -1 和 1 或 0 和 1 的范围内得到这些点,并且,如果有第一个一组值,然后我将这些点分别乘以屏幕坐标 x 和 y 值的屏幕宽度和高度,或者将这些值乘以屏幕高度/2 和宽度/2,并将相同的值添加到各个点。

任何一步一步地告诉我如何实现这一点,或者我可能会在哪里出错,我们将不胜感激! :D

大家好!

附:在单位/平移矩阵的示例中,我的模型中的矩阵格式是:

[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]

【问题讨论】:

  • 抱歉带回了死者和所有人...但是在您的createPerspectiveMatrix 代码中,不应该matrix.m32 = 1.0matrix.m33 = 0.0 吗?如果这最初是打算作为一个“填充”的单位矩阵,那么这些值似乎在您的代码中被交换了。
  • 谢谢,因为我问了这个问题,所以我写了 Zest3D zest3d.com 所以我想通了。 :)

标签: 3d matrix camera projection perspective


【解决方案1】:

您的问题是您忘记执行透视分割。

透视除法意味着您将点的 x、y 和 z 分量除以其 w 分量。 这是将您的点从 同质 4D 空间 转换为 标准化设备坐标系 (NDCS) 所必需的,其中每个分量 x、y 或 z 都介于 -1 和 1 之间,或者0 和 1。

在此转换之后,您可以进行视口转换(将点乘以屏幕宽度、高度等)。

在 Foley 的书(计算机图形学:C 中的原则和实践)中有关于这种转换管道的很好的观点,你可以在这里看到它:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

【讨论】:

    【解决方案2】:

    对于这样的问题,我会建议一个很好的资源: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ 它确实涉及投影矩阵的细节。它们是关于相机、构建相机光线等主题的更多课程。您需要进行一些挖掘。

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 2015-04-11
      • 1970-01-01
      • 2019-06-08
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多