计算机图形学基础笔记(2.4)

198 阅读10分钟

Category:Higher Mathematics & Computer Graphics Application

正文

2.5 曲线和曲面(二)

2.5.3 3D 隐式曲面

正如隐式方程可用于定义 2D 曲线一样,它们也可用于定义 3D 曲面。与 2D 一样,隐式方程隐式定义了表面上的一组点:

image.png

当作为 f 的参数给出时,曲面上的任何点 (x, y, z) 都会导致零。任何不在表面上的点都会产生一些非零的数字。您可以通过计算 f 来检查一个点是否在曲面上,或者您可以通过查看 f 的符号来检查该点位于曲面的哪一侧,但您不能总是明确地在曲面上构造点。使用矢量符号,我们将 p = (x, y, z) 的函数写为

image.png

2.5.4 隐式曲面法线

曲面法线(除其他外,照明计算需要)是垂直于曲面的向量。曲面上的每个点都可能有不同的法向量。与梯度为 2D 中的隐式曲线提供法线的方式相同,隐式曲面上点 p 处的曲面法线由隐式函数的梯度给出: image.png 与 2D 情况原因相同:梯度指向 f 增加最快的方向,该方向垂直于与表面相切的所有方向,其中 f 保持不变。梯度向量指向 f(p) > 0 的表面一侧,在给定的上下文中,我们可以将其视为“进入”表面或“离开”表面。如果 f 的特定形式产生向内梯度,并且需要向外梯度,则表面 -f(p) = 0 与表面 f(p)=0 相同,但具有方向相反的梯度,即 -∇f( p) = ∇(−f(p))

隐式平面

例如,考虑通过点 a 且曲面法线为 n 的无限平面。

描述该平面的隐式方程由下式给出

image.png

请注意,a 和 n 是已知量。点 p 是满足方程的任何未知点。用几何术语来说,这个等式表示“从 a 到 p 的向量垂直于平面法线”。如果 p 不在平面内,则 (p - a) 不会与 n 成直角(图 2.33)。

image.png

有时我们需要通过点 a、b 和 c 的平面的隐式方程。该平面的法线可以通过取平面中任意两个向量的叉积来找到。一种这样的交叉产品是

image.png

这允许我们写出隐式平面方程:

image.png 解读这个方程的几何方法是由 p - a、b - a 和 c - a 定义的平行六面体的体积为零,即它们是共面的。只有当 p 与 a、b 和 c 在同一平面上时,这才是正确的。行列式给出了对此的完整笛卡尔表示(这将在第 5.3 节中更详细地讨论): image.png

行列式可以扩展(见第 5.3 节扩展行列式的机制)到具有许多项的复杂形式。

等式 (2.22) 和 (2.23) 是等价的,比较它们是有益的。等式(2.22)很容易从几何上解释,并且会产生有效的代码。此外,如果利用已调试的交叉点积代码,则相对容易避免编译成错误代码的印刷错误。

等式 (2.23) 也很容易从几何上解释,并且如果实现了有效的 3 × 3 行列式函数,它将是有效的。如果函数行列式(a,b,c)可用,也很容易实现而没有拼写错误。如果您重命名行列式函数卷,其他人将特别容易阅读您的代码。所以方程(2.22)和(2.23)都很好地映射到代码中。将任一方程完全扩展为 x、y 和 z 分量可能会产生拼写错误。这样的错别字很可能会被编译,因此特别讨厌。这是干净的数学生成干净的代码和臃肿的数学生成臃肿的代码的一个很好的例子。

3D 二次曲面

正如两个变量中的二次多项式定义 2D 中的二次曲线一样,x、y 和 z 中的二次多项式定义 3D 中的二次曲面。例如,一个球体可以写成

image.png

并且可以将轴线对准的椭圆形写为

image.png

隐式曲面的 3D 曲线

人们可能希望可以使用 f(p) = 0 的形式创建隐式 3D 曲线。但是,所有这些曲线都只是退化曲面,在实践中很少有用。可以从两个联立隐式方程的交点构造 3D 曲线:

image.png

例如,可以从两个隐式平面的交点形成 3D 线。

通常,使用参数曲线更方便;它们将在以下各节中讨论

2.5.6 2D 参数曲线

参数曲线由单个参数控制,该参数可以被视为一种沿曲线连续移动的索引。这样的曲线具有形式: image.png 这里(x,y)是曲线上的一个点,t是影响曲线的参数。

对于给定的t,将有一定程度由函数g和h确定。对于连续的G和H,t的少量变化将产生X和Y的微小变化。

因此,随着t的连续变化,点在连续曲线中被扫除。这是一个不错的功能,因为我们可以使用参数t在曲线上明确构建点。通常,我们可以以向量形式编写参数曲线,

image.png

其中 f 是向量值函数,f : R → R2。此类向量函数可以生成非常干净的代码,因此应尽可能使用它们。

我们可以将具有位置的曲线视为时间的函数。曲线可以去任何地方,可以循环和交叉。我们也可以认为曲线在任何点都有速度。例如,点 p(t) 在 t = -2 附近缓慢移动,在 t = 2 和 t = 3 之间快速移动。这种类型的“移动点”词汇经常在讨论参数曲线时使用,即使曲线没有描述一个移动点

二维参数线

通过点 p0 = (x0, y0) 和 p1 = (x1, y1) 的二维参数线可以写为:

image.png

因为 x 和 y 的公式具有如此相似的结构,我们可以使用 p = (x, y) 的向量形式(图 2.34):

image.png

image.png

您可以将其以几何形式解读为:“从点 p0 开始,向由参数 t 确定的 p1 走一段距离。”这种形式的一个很好的特点是 p(0) = p0 和 p(1) = p1。由于该点随 t 线性变化,因此 p0 和 p1 之间的 t 值测量点之间的分数距离。 t < 0 的点位于 p0 的“远”侧,t > 1 的点位于 p1 的“远”侧。

参数线也可以仅描述为一个点 o 和一个向量 d:

image.png

当向量 d 具有单位长度时,线是弧长参数化的。这意味着 t 是沿线的距离的精确度量。任何参数曲线都可以进行弧长参数化,这显然是一种非常方便的形式,但并不是所有的都可以解析转换。

2D 参数圆

圆心 (xc, yc) 半径为 r 的圆具有参数形式:

image.png

为了确保曲线上的每个点都有一个唯一的参数 φ,我们可以限制它的域:φ ∈ [0, 2π) 或 φ ∈ (-π, π] 或任何其他长度为 2π 的半开区间。

可以通过分别缩放 x 和 y 参数方程来构造轴对齐的椭圆:

image.png

2.5.7 3D 参数曲线

3D 参数曲线的操作很像 2D 参数曲线:

image.png

例如,围绕 z 轴的螺旋线可写为:

image.png

与二维曲线一样,如果我们想控制曲线的起点和终点,函数 f、g 和 h 定义在域 D ⊂ R 上。我们可以写成向量形式

The parametric curve is the range of p: R → R3. image.png

在本章中,我们仅详细讨论 3D 参数线。通用 3D 参数曲线在第 15 章中进行了更广泛的讨论.

3D 参数线

3D 参数线可以写成 2D 参数线的直接扩展,例如,

image.png

这很麻烦并且不能很好地转化为代码变量,所以我们将其写成向量形式:

image.png

其中,对于本例,o 和 d 由下式给出

image.png

请注意,这与2D情况非常相似。可视化的方法是想象该线经过O,并且与D平行。考虑到t的任何值,您在行上获得了一些点P(t)。例如,在t = 2,p(t)=(2,1,3)2(7,2,-5)=(16,5,-7)。这个一般概念与二维相同(图2.30)。

与2D一样,可以通过3D参数线和间隔t∈[TA,TB]描述线段。两个点a和b之间的线段由p(t)= a t(b - a)给出,t∈[0,1]。这里p(0)= a,p(1)= b,p(0.5)=(a b)/2,a和b之间的中点。

射线或半线是一条3D参数线,通常[0,∞)。从现在开始,我们将把所有线条,线段和射线称为“光线”。这很草率,但与常见用法相对应,使讨论变得更加简单.

2.5.8 3D 参数曲面

参数化方法可用于定义 3D 空间中的曲面,其方式与我们定义曲线的方式非常相似,只是有两个参数来处理曲面的二维区域。这些表面具有形式

image.png

或者,以矢量形式

image.png

例子。例如,地球表面上的一个点可以用经度和纬度两个参数来描述。如果我们将原点定义为地球的中心,并让 r 为地球的半径,那么以原点为中心的球坐标系(图 2.35)让我们推导出参数方程

image.png

(1.参数曲面是函数 p 的范围:R2 → R3。
2.假装地球是完全球形的
3.根据您的背景,这里的 θ 和 φ 可能会或可能不会颠倒;这些符号的使用因学科而异。在本书中,我们将始终假设方程(2.24)中使用的 θ 和 φ 的含义,如图 2.35 所示。)

image.png

理想情况下,我们希望将其写成向量形式,但对于这种特殊的参数形式是不可行的。

我们还希望能够找到给定 (x, y, z) 的 (θ, φ)。如果我们假设 φ ∈ (−π, π] 使用方程 (2.2) 中的 atan2 函数很容易做到:

image.png

对于隐式曲面,函数 f 的导数为我们提供了曲面法线。对于参数曲面,p 的导数还提供有关曲面几何的信息。

考虑函数 q(t) = p(t, v0)。该函数定义了一条通过改变 u 而获得的参数曲线,同时保持 v 的值固定为 v0。这条曲线称为等参曲线(或有时简称为“等参曲线”)位于曲面中。 q 的导数给出了与曲线相切的向量,并且由于曲线位于曲面中,因此向量 q 也位于曲面中。因为它是通过改变 p 的一个参数而获得的,所以向量 q 是 p 关于 u 的偏导数,我们将其表示为 pu。一个类似的论点表明,偏导数 pv 给出了常数 u 的等参曲线的切线,u 是曲面的第二个切线向量。

那么 p 的导数在曲面上的任意点给出两个切向量。可以通过取这些向量的叉积来找到曲面的法线:由于两者都与曲面相切,因此它们的叉积(垂直于两个切线)垂直于曲面。叉积的右手定则提供了一种方法来决定哪一侧是表面的前面或外面;我们将使用向量的约定

image.png

指向表面的外侧。

2.5.9 曲线和曲面总结

2D 中的隐式曲线或 3D 中的曲面由两个或三个变量 f : R2 → R 或 f : R3 → R 的标量值函数定义,并且曲面由函数为零的所有点组成:

image.png

2D 或 3D 中的参数曲线由一个变量 p : D ⊂ R → R2 或 p : D ⊂ R → R3 的向量值函数定义,并且随着 t 在整个 D 上变化,曲线被扫除:

image.png

3D中的参数表面由两个变量的矢量值函数定义,p:d⊂r2→r3,表面由域中的所有点(u,v)的图像组成:

image.png

对于隐式曲线和曲面,法向量由 f(梯度)的导数给出,而切向量(对于曲线)或向量(对于曲面)可以通过构造基础从法线导出。

对于参数化曲线和曲面,p 的导数给出切线向量(对于曲线)或向量(对于曲面),而法向量可以通过构造基从切线导出。