背面检测方法
编程语言用于许多目的,例如制作网站、开发移动应用程序等。图形设计是我们可以使用编程语言进行的事情之一。在图形设计中,我们可能会遇到一个问题,即我们必须在二维平面上投影一个三维物体,因此一个维度将被缩小或一个面将被隐藏。在这个问题中,我们必须检测出那个隐藏的面。
背面检测也称为平面方程方法,它是一种对象空间方法,其中将对象或基本上给定对象的部分相互比较,以确定三维物体是否会投射到二维表面上,然后哪些表面是可见的。
假设我们有一个由三个三角形面组成的棱镜,其中一个面不可见。我们将选择棱镜的当前面,该面可能对用户不可见,如果当前面对用户不可见,则我们将保留或丢弃它并移至下一个面。
每个平面都有一个法向量,如果当前平面的法向量指向投影中心的反方向,则该面对用户不可见,否则对用户可见。
三维系统
在三维系统中,我们有三个维度,比如说 x、y 和 z 维度。我们假设 x 和 y 维度是我们最终的 2 维,z 维度是将减小的第 3 维。
z 维度可以用两种方式假设,首先,要么向内,要么是左手系,要么是从 2-D 平面向外,是右手系。对于这两个系统,算法将有所不同。让我们逐一查看这两个维度 -
左手系算法
对于左手系,步骤如下 -
首先,我们将获得给定物体每个面的法向量 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 或 C < 0
这里 V 是表面矢量。
当前方法的局限性
上述方法在大多数情况下都能正常工作,但该方法也存在一些局限性 −
对于凹多面体,此方法可能无法正常工作,但对于凸多面体,此方法始终可以正常工作。
上述方法仅适用于实体对象,而不适用于建模的多边形网格。
结论
在上述教程中,我们学习了一种在二维平面上投射三维物体时检测背面的方法。对于左手系,背面检测方法非常简单。如果给定向量的 z 分量小于零,则当前面为正面。如果给定向量的 z 分量大于零,则当前面为正面,否则为背面。