有没有办法在光栅化时避免除以 0?
Is there a way to avoid the divison by 0 while rasterizing?
我正在做一个项目,我必须计算给定 世界点 的 屏幕坐标 。
我读了一些 material 并将此任务组织成四个子任务:
- 将世界点与我相机的逆TRS矩阵相乘得到相机坐标点。
将相机坐标中的点与投影矩阵相乘得到裁剪坐标中的点。投影矩阵看起来像这样
(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;
- 将裁剪坐标中的点乘以1/w得到ndc中的点.
- 将ndc转换为屏幕坐标。
这工作正常,但我遇到了一些奇怪的结果和错误。事实证明,如果点在相机坐标中的z值为0,则点在裁剪坐标中的w值变为0。
这导致在步骤 3 中除以 0。
我是不是忽略了什么或者这正常吗?有没有办法计算相机 z 轴上点的屏幕位置,或者我应该只检查 (z == 0)
和 return 是否在屏幕中间?
您正在做中心投影。在相机坐标中,投影中心是原点。投影平面是摄像机前与x-y平面平行的任意平面(即z != 0)。
现在想象一下在相机坐标中 z=0 的点会发生什么。它的投影光线将平行于投影平面。因此,它在平面上没有图像。这就是被零除的意思。
在渲染过程中,您通常会设置一个近裁剪平面来避免这种情况(即平面前面的任何东西都会被忽略)。这也避免了相机后面的物体变得可见。
所以,插入一张支票 if z in camera coordinates < near then ignore
。或者如果你有一个左手坐标系 ... > -near ...
我正在做一个项目,我必须计算给定 世界点 的 屏幕坐标 。
我读了一些 material 并将此任务组织成四个子任务:
- 将世界点与我相机的逆TRS矩阵相乘得到相机坐标点。
将相机坐标中的点与投影矩阵相乘得到裁剪坐标中的点。投影矩阵看起来像这样
(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;
- 将裁剪坐标中的点乘以1/w得到ndc中的点.
- 将ndc转换为屏幕坐标。
这工作正常,但我遇到了一些奇怪的结果和错误。事实证明,如果点在相机坐标中的z值为0,则点在裁剪坐标中的w值变为0。 这导致在步骤 3 中除以 0。
我是不是忽略了什么或者这正常吗?有没有办法计算相机 z 轴上点的屏幕位置,或者我应该只检查 (z == 0)
和 return 是否在屏幕中间?
您正在做中心投影。在相机坐标中,投影中心是原点。投影平面是摄像机前与x-y平面平行的任意平面(即z != 0)。
现在想象一下在相机坐标中 z=0 的点会发生什么。它的投影光线将平行于投影平面。因此,它在平面上没有图像。这就是被零除的意思。
在渲染过程中,您通常会设置一个近裁剪平面来避免这种情况(即平面前面的任何东西都会被忽略)。这也避免了相机后面的物体变得可见。
所以,插入一张支票 if z in camera coordinates < near then ignore
。或者如果你有一个左手坐标系 ... > -near ...