geometry - 透视投影: Proving that 1/z is Linear?

标签 geometry rendering perspective

在 3D 渲染(或几何图形)中,在光栅化算法中,当您将三角形的顶点投影到屏幕上,然后查找像素是否与 2D 三角形重叠时,您通常需要查找深度或像素重叠的三角形的 z 坐标。一般来说,该方法包括计算三角形的二维“投影”图像中像素的重心坐标,然后使用这些坐标来插值三角形原始顶点的 z 坐标(在顶点投影之前)。

现在所有教科书中都写到,你不能直接对顶点的顶点坐标进行插值,而是需要这样做:

(抱歉无法让 Latex 工作?)

1/z = w0 * 1/v0.z + w1 * 1/v1.z + w2 * 1/v2.z

其中 w0、w1 和 w2 是三角形上“像素”的重心坐标。

现在,我关心的是两件事:

  • 证明插值 z 不起作用的正式证据是什么?
  • 证明 1/z 正确的正式证据是什么?

为了表明这不是家庭作业;-)并且我自己做了一些工作,我找到了问题 2 的以下解释。

基本上,三角形可以通过平面方程来定义。因此你可以写:

Ax + By + Cz = D。

然后分离 z 得到 z = (D - Ax - By)/C

然后你将此公式除以 z,就像使用透视除法一样,如果你展开、重新组合等,你会得到:

1/z = C/D + A/Dx/z + B/Dy/z。

然后我们将 C'=C/D B'=B/D 和 A'=A/D 命名为:

1/z = A'x/z + B'y/z + C'

它说 x/z 和 y/z 只是投影到屏幕上的三角形上的点的坐标,而右侧的方程是“仿射”函数,因此 1/z 是线性函数? ??

这对我来说不像是一个演示?或者也许这是正确的想法,但不能真正说明如何通过仅查看方程来判断这是一个仿射函数。如果将所有项相乘,则得到:

A'x + B'y + C'z = 1。

这基本上就是我们原来的方程(只需用适当的项替换 A' B' 和 C')。

最佳答案

不确定您想在这里问什么,但如果您查看:

1/z = A'x/z + B'y/z + C'

并将其重写为:

1/z = A'u + B'v + C'

其中(u,v)是透视投影后三角形的屏幕坐标,可以看到三角形上一点的深度(z)不是与 (u,v) 线性相关,但 1/深度 是线性相关的,这就是教科书试图教给您的内容。

关于geometry - 透视投影: Proving that 1/z is Linear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707584/

相关文章:

java - 当我们有坐标列表时如何在 JTS 中创建多边形?

java - 让一个球在另一个球内弹跳

python-3.x - 如何使用opencv python在各种彩色背景中找到文档边缘? 【各种背景下的文档扫描】

javascript - 将 Threejs 透视相机转换为正交相机需要什么

reactjs - 如何根据事件触发的某些条件以 redux 形式显示或隐藏字段

java - Eclipse 插件 : how to show . * 透视图默认资源

geometry - 欧拉计划 126 : could someone explain?

opencv - 3D 相机坐标到世界坐标(改 rebase 础?)

performance - Raytracer - 寻找下一个光线交点的标准方法是什么,它们的优缺点是什么

video - 在 FFPLAY 窗口上显示 YUV/RGB 帧