1. 主页
  2. 文档
  3. 计算机图形学基础教程
  4. 计算机图形学基础 数学杂项
  5. 积分

积分

关于图形学的一个可能的误导是,它充满了积分,因此人们可能认为必须善于用代数方法解决积分问题。事实绝对不是这样的。图形学中的大多数积分都不能用分析法解决,因此要用数字法解决。在图形学领域有一个伟大的职业生涯,但从未用代数方法解决过一个积分,这是很有可能的。

虽然你不需要能够用代数求解积分,但你确实需要能够读懂它们,以便你能够数值求解它们。在一维中,积分通常是很容易读懂的。例如,这个积分

$\int_π^{2π}sin(x)dx$

可以理解为“计算函数sin (x)在x = π和x = 2π之间的面积”。计算机科学家可能会这样看:

$\int_π^{2π}dx$

作为一个函数调用。我们可以通过 “integration()”调用。它需要两个对象:一个函数和一个域(区间)。所以整个调用可能是

float area = integrate(sin(), [pi,2pi])

在更高级的微积分中,我们可以开始在球面上求积分,对于图形学来说,我们仍然可以这样想:

float area = integrate(cos(), unit-sphere)

这个函数的机制可能不同,但所有的积分都有两个东西

1. 被积分的函数

2. 它被积分的域。

通常的诀窍就是仔细解码出1和2对应的问题。这在本质上与从有时令人困惑的文档中正确获取API调用非常相似。

平均数和加权平均数

积分是计算事物的总和。长度、面积、体积,等等。但它们经常被用来计算平均数。例如,我们可以通过整合一个地区(如一个国家)的海拔高度来计算一个地区的总体积

float volume = integrate(elevation(), country)

但我们也可以计算出平均海拔:

float averageElevation = integrate(elevation(),country) / integrate(1, country)

这基本上是 “用体积除以面积”。这可以被抽象为

Float averageElevation = average(elevation, country)

我们也可以取加权平均。在这里,我们添加了一个加权函数来强调平均值中的某些点。例如,如果我们想通过温度来强调某一区域的某一部分(这是很随意的,我们将在下一节看到更多相关的图形示例):

float weightedAverageElevation =integrate(temperature()*elevation(),country) / integrate(temperature(), country)

注意这种形式是个好主意;通常积分包含一个加权平均数而没有明确指出,有时它可以帮助直觉。

对立体角积分

我们经常看到的一种积分的例子是这些形式之一或相关的东西。

float shade = integrate(cos()*f*(),unit-hemisphere)

请注意,由于 integrate(cos(), unit-hemisphere) = pi, 加权平均版本只是

float shade = integrate((1/pi)*cos()*f*(),unit-hemisphere)

这个积分的更传统的形式是

S = $\int_{v∈H}\frac{1}{π}(v ⋅ n)f(v)(v ⋅ n)dσ (v)$

或者用球面坐标,因为我们可能会用代数法来解决这种积分。

S = $\int_{ϕ=0}^{2π} \int_{θ=0}^π\frac{1}{π}(v ⋅ n)f(θ, ϕ)cosθsinθdθdϕ$

正弦项是球面坐标的面积修正系数。请注意,在图形学中,我们很少需要把这些都写出来,在数值求解积分时,我们将使用没有明确坐标的简单形式

上面的特定积分是一个完全反射的matte(dif-fuse)表面的阴影,它也是所有入射颜色的加权平均。这种结构对于直觉来说是很好的;一个表面的颜色通常与入射颜色的加权平均数有关。

立体角上的积分几乎都是一样的,但使用了各种各样的符号。关键是要认识到这只是符号,并将你看到的符号映射到你最熟悉的符号。这很像阅读伪代码!

 

这篇文章对您有用吗? 1