在栅格化时有没有办法避免将0除以?

时间:2015-10-07 09:11:11

标签: math projection rasterizing

我正在开发一个项目,我必须计算给定世界点的屏幕坐标

我阅读了一些材料并将此任务组织成四个子任务:

  1. 世界点与我的相机的逆TRS矩阵相乘,以接收相机坐标中的
  2. 将相机坐标中的点与投影矩阵相乘,以接收剪切坐标中的点。投影矩阵看起来像这样

    (1 / tan (fov * 0.5 * PI / 180)), 0, 0, 0;   
    0, (1 / tan (fov * 0.5 * PI / 180)), 0, 0;  
    0, 0, - ((f + n) / (f - n)), - (2 * f * n / (f - n));   
    0, 0, -1, 0;
    
  3. 将剪切坐标中的点与 1 / w 相乘,以接收ndc 中的点。
  4. ndc 转换为屏幕坐标
  5. 这很好用,但我遇到了一些奇怪的结果和错误。事实证明,如果相机坐标中的点的z值为0,则剪切坐标点的w值将变为0。 这导致在步骤3中除以0。

    我是否忽略了某些事情或这是正常的吗?有没有办法计算摄像机z轴上点的屏幕位置,还是应该检查是否(z == 0)并返回屏幕中间?

1 个答案:

答案 0 :(得分:1)

您正在进行中心投影。在相机坐标中,投影中心是原点。投影平面是与摄像机前面的x-y平面平行的任何平面(即z!= 0)。

现在想象一下在相机坐标中z = 0的点会发生什么。其投射光线将与投影平面平行。因此,它在平面上没有图像。这就是除零所表示的。

在渲染过程中,您通常会设置一个近剪裁平面以避免这种情况(即,将忽略平面前面的任何内容)。这也避免了相机后面的物体变得可见。

因此,请插入支票if z in camera coordinates < near then ignore。或者,如果您有左手坐标系... > -near ...