背面检测方法
编程语言用于许多目的,例如制作网站、开发移动应用程序等。图形设计是我们可以使用编程语言完成的事情之一。在进行图形设计时,我们可能会遇到一个问题,即需要将 3D 对象投影到 2D 平面上,这会导致一个维度减少或一个面被隐藏。在这个问题中,我们需要检测那个隐藏的面。
背面检测也称为平面方程方法,它是对象空间方法中的一种方法,其中将对象或给定对象的各个部分相互比较,以查找如果将 3D 对象投射到 2D 表面,则哪些表面是可见的。
假设我们有一个棱柱,它由三个三角形面组成,其中一个面不可见。我们将针对棱柱的当前面,该面可能对用户不可见,如果当前面对用户不可见,则我们将跳过它或将其丢弃并移动到下一个面。
每个平面都有一个法向量,如果当前平面的法向量指向投影中心的外部,则该面对用户不可见,否则对用户可见。
三维系统
在三维系统中,我们有三个维度,例如 x、y 和 z 维度。我们假设 x 和 y 维度是我们的最终二维,而 z 维度是将被减少的第三维度。
z 维度可以以两种方式假设,第一种是它向内或左手系移动,或者它从 2D 平面向外移动,它是右手系。对于这两种系统,算法将有所不同。让我们逐一查看这两个维度 -
左手系算法
对于左手系,步骤如下 -
首先,我们将获取给定对象的每个面的法向量 N。
然后,我们将计算它与中心 C 的法向量的点积。
如果 Z 分量小于零,则当前面是背面,无需绘制它。
否则,当前面将可见,我们将绘制它。
从以上步骤可以得出结论,对于右手系,背面检测方法非常简单。如果给定向量的 z 分量大于零,则当前面是前面,否则是背面。
右手系算法
对于左手系,步骤如下 -
首先,我们将获取给定对象的每个面的法向量 N。
然后,我们将计算它与中心 C 的法向量的点积。
如果 Z 分量小于零,则当前面是背面,无需绘制它。
否则,当前面将可见,我们将绘制它。
从以上步骤可以得出结论,对于右手系,背面检测方法非常简单。如果给定向量的 z 分量大于零,则当前面是前面,否则是背面。
示例
例如,我们有一个多边形,并且面的特定点具有坐标 (A、B、C) 或法向量在其内包含这些变量。此外,从多边形的方程我们可以得到 -
Ax + By + Cz + D < 0
其中,D 是一个常数。
当前面的法向量是
N = (A, B, C)
如果我们有 V.N < 0,则当前面是前面。这相当于背面方程为 -
(0, 0, -1).N > 0 Or C < 0
这里 V 是表面向量。
当前方法的局限性
上述方法在大多数情况下都能正常工作,但给定方法有一些局限性 -
对于凹多面体,此方法可能无法正常工作,但对于凸多面体,此方法始终有效。
上面给出的方法仅适用于实体对象,而不适用于例如多边形网格的建模对象。
结论
在本教程中,我们学习了一种在将 3D 对象投射到 2D 平面上时检测背面的方法。对于左手系,背面检测方法非常简单。如果给定向量的 z 分量小于零,则当前面是前面。如果给定向量的 z 分量大于零,则当前面是前面,否则是背面。