【问题标题】:Perspective projection - how do I project points which are behind 'camera'?透视投影 - 我如何投影“相机”后面的点?
【发布时间】:2010-07-25 13:16:42
【问题描述】:

我正在用 Java 编写自己的软件光栅化器,但遇到了一些麻烦...请看一下示例图像:

Image

这个示例只是在平面上绘制简单的方形网格。一切正常,直到我将相机移动得足够近以使某些点移动到它后面。之后,它们不再正确投影,如​​您所见(垂直线 - 应该在相机后面的点被投影在屏幕顶部)。

我的变换矩阵和向量与 DirectX 使用的相同(PerspectiveFovLH 用于投影,LookAtLH 用于相机)。

我正在使用以下变换方法来投影 3D 点:

  1. 要转换的 3D 矢量已创建。
  2. 向量乘以 ViewProjection 矩阵。
  3. 之后,使用以下方法将点转换为屏幕:

    // 'vector' is input vector in projection space
    // projection to screen
    double vX = vector.x / vector.z;        
    double vY = vector.y / vector.z;
    
    //translate
    //surfaceW is width and surfaceH is height of the rendering window.
    vX = (( vX + 1.0f) / 2.0f) * surfaceW;
    vY = ((-vY + 1.0f) / 2.0f) * surfaceH;
    
    return new Vector3(vX, vY, vector.z);
    

正如我之前所说,它可以正常工作,直到点移动到相机后面。事实是,我可以确定该点何时位于相机后面(通过在最终变换后测试它的 Z 值),但由于我正在绘制线条和其他基于线条的对象,所以我不能跳过那个点。

然后我尝试根据 MSDN 上的Direct3D 转换管道文章设置我的转换管道。

不幸的是,我也没有任何运气(相同的结果),所以任何帮助将不胜感激,因为我有点卡在这个问题上。

谢谢。

最好的问候, 亚历克斯

【问题讨论】:

  • 您是否正确设置了相机的前剪裁平面?然后在渲染的时候考虑进去?
  • 我的 zNear 平面设置为 1,zFar 平面设置为 1000 个单位。我尝试更改值,但问题仍然存在。有什么建议吗?
  • 我已经有一段时间没有做这种事情了,但是您需要在投影线之前执行与前剪切平面的相交。

标签: 3d geometry camera projection perspective


【解决方案1】:

您需要将线与 3d 空间中的前剪切平面相交并截断该线,以便仅绘制可见的线段:

             |
             |
             |
x------------+-----------o
             |
             |
             |   * - camera
             |
             |
             |
       clipping plane

你有一条线xo,其中x在剪切平面前面,o在它后面。将此线与剪裁平面相交以生成点+。您知道xo 中的哪一个是可见的,因此请在x+ 之间画一条线。

这样您就不会投影相机后面的点。

【讨论】:

  • 谢谢。如果我在剪辑空间中、透视变换之后、透视分割之前(使用齐次坐标和 w)这样做可以吗?
  • @Alex 是的。我相当肯定你可以在剪辑空间甚至 NDC 中做到这一点
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 2014-04-12
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多