【问题标题】:Is there a way to avoid the divison by 0 while rasterizing?光栅化时有没有办法避免除以0?
【发布时间】:2016-01-04 10:47:37
【问题描述】:

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

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

  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转换成屏幕坐标

这工作正常,但我遇到了一些奇怪的结果和错误。事实证明,如果相机坐标中的点的z值为0,则裁剪坐标中的点的w值为0。 这导致在第 3 步中除以 0。

是我忽略了什么还是这正常?有没有办法计算相机 z 轴上点的屏幕位置,或者我应该只检查 (z == 0) 并返回屏幕中间?

【问题讨论】:

  • 最有效的方法是添加支票

标签: math projection rasterizing


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的详细解释。我考虑了这一点,并明白 x-y 平面上的任何点的唯一方法是接近剪切平面 n <= 0fov >= pi
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2011-09-13
  • 2013-04-06
  • 1970-01-01
  • 2021-12-15
  • 2021-10-06
相关资源
最近更新 更多