logo
Published on

第二章 图形学中的数学

Authors

前言

大部分图形学只是将数学直接转换成代码。数学越清晰,生成的代码就越清晰;

本书的大部分内容都集中在使用正确的数学来完成工作。 本章回顾了高中和大学数学的各种工具,旨在作为参考而不是教程。

它可能看起来像是一堆杂乱无章的主题,事实上也是如此;每个主题之所以被选中,是因为它在“标准”数学课程中有点不寻常,因为它在图形学中至关重要,或者因为它通常不是从几何角度来处理的。

除了回顾本书中使用的符号外,本章还强调了标准本科课程中有时会忽略的几点,例如三角形的重心坐标。本章并非旨在对材料进行严格的处理;相反,本章强调直觉和几何解释。 线性代数的讨论被推迟到第 6 章,就在讨论变换矩阵之前。建议读者浏览本章以熟悉所涵盖的主题,并在需要时参考。本章末尾的练习可能有助于确定哪些主题需要复习。

2.4 向量

一个向量描述着一个长度和一个方向.我们可以用一个箭头来代表它. 即使两个不在同一个位置, 但是只要他们的长度方向一样, 那么这两个向量就相等.

特别重要的是, 我们应该想到向量的第一反应,它应该是一个箭头而不是数字或者坐标! 在某些情况下, 我们会在程序中用数字代表向量,但是即使是在代码中,向量也应该被当作对象处理,只有底层的向量运算才应该知道它的数值表示.

向量通常会被用作粗体字来展示, 比如: a. 一个向量的长度用符号表示,例如 |a|。单位向量是长度为一的向量.0向量是长度为0的向量.0向量的方向是undefined

向量可以被用于代表很多不同的东西.例如,他们可以用来存储偏移量(位移).偏移量这个概念很有意思, 我们可以通过描述宝藏的偏移量: “宝藏埋在秘密会面地点以东两步、以北三步的地方”, 来确认寻找宝藏的路径,但是我们不知道起点也就是秘密会面地点,所以我们就没法开始.此外, 向量还可以用来存储位置,位置可以表示为与量一个位置的位移.通常,存在某个已知的原点位置,所有其他位置都以偏移量的形式存储。 距离,所有其他位置都以偏移量的形式存储。请注意,位置不是向量。正如我们将要讨论的,您可以将两个向量相加。但是,除非是在计算位置的加权平均值时进行中间操作,否则通常没有必要相加两个位置(Goldman,1985)。相加两个偏移量确实有意义,所以这就是偏移量是向量的原因之一。但这强调了位置不是偏移量;它是与特定原点位置的偏移量。偏移量本身不是位置。

举例子: (1,1)向量的描述就是,沿原点逆时针45度走根号2的长度.那么用偏移量存储的话就是: 逆时针45度走根号2的长度(可以应用到任何点)

2.4.1 向量运算

向量具有我们与实数相关的大多数常见算术运算。当且仅当两个向量具有相同的长度和方向时,它们才相等。 两个向量相加遵循平行四边形规则。该规则指出,两个向量的和是通过将任一向量的尾部放在另一个向量的头部上来找到的(图 2.12)。 和向量是“完成由两个向量开始的三角形”的向量。平行四边形可以通过以任意顺序求和来形成。这强调了向量加法是可交换的:

a + b=b+a。

请注意,平行四边形规则只是形式化了我们对位移的直觉。 想象沿着一个向量行走,从尾部到头部,然后沿着另一个向量行走。 净位移就是平行四边形的对角线。您还可以为向量创建一元减法:—a(图 2.13)是与 a 长度相同但方向相反的向量。这使我们能够定义减法:

b-a=-a + b。

您可以使用平行四边形来直观地展示向量减法(图 2.14)。我们可以写成

a + (b-a) = b。

向量也可以相乘。事实上,有几种涉及向量的乘积。首先,我们可以通过将向量乘以实数 k 来缩放向量。

2.4.3 点乘

将两个向量相乘的最简单方法是点积。a 和 b 的点积表示为 a • b,通常称为标量积,因为它返回标量。点积返回与其参数长度和它们之间的角度 o 相关的值: a • b= ||a|| ||b|| cos o,

2.4.4 叉积

叉积 a x b 通常仅用于三维向量;广义叉积在章节注释中给出的参考文献中讨论。叉积返回一个垂直于叉积的两个参数的 3D 向量。叉积得到的新向量的长度与 sin 有关: || a x b|| = ||a|| ||b|| sin ф。

ф的角度取决于: a,b向量的夹角(因此a x a 长度为0,就是0向量,方向为undefined)

右手坐标系的解释 参考图片

2.4.5 正交基和坐标系

管理坐标系是几乎所有图形程序的核心任务之一;其中的关键是管理正交基。(任何向量都可以由基向量线性组合形成) 任何两个 2D 向量 u 和 v 的集合都形成正交基,前提是它们是正交的(直角)并且每个向量的长度都是单位。

基于正交基, 我们定义全局坐标系由从原点开始的基向量构成, 而对于局部坐标系, 它由特定的基向量构成. 全局坐标系还可以和局部坐标系进行转换, 因为局部坐标系相对于全局坐标系有一个偏移量offset

图 2.21。始终存在一个主坐标系或“规范”坐标系,其原点为 o,基点为正交 x、y 和 z。该坐标系通常定义为与全局模型对齐,因此通常称为“全局”或“世界”坐标系。 该原点和基向量从未明确存储。所有其他向量和位置都与将它们与全局框架相关联的坐标一起存储。与平面相关联的坐标系以全局坐标的形式明确存储。

第 7.2.1 节和第 7.5 节讨论了使用矩阵来管理坐标系的变化。

2.5积分

图形学中可能存在一个误导性的东西,那就是它充满了积分,因此人们可能认为必须擅长代数解积分。 事实绝非如此。图形学中的大多数积分都不是解析解,因此需要用数值方法求解。 在图形学中,一个人完全有可能完成一个很大的项目,却从未用代数方法求解过一个积分。

虽然你不需要能够用代数方法求解积分,但你确实需要能够读懂它们,这样你才能用数值方法求解它们。在一个维度上,积分通常非常易读。 例如下面的代码:

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

它代表着:

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

2.6 密度函数

密度函数在图形中经常出现(例如“概率密度函数”),有时它们会令人感到困惑,但了解它们到底是什么将有助于我们使用它们, 并在困惑来袭时摆脱困惑。我们知道什么是函数,密度函数就是返回密度的函数。那么什么是密度?密度是“每单位某物”的东西,或者更正式地说是强度量。 例如,你的体重不是密度,它是一个广义量,或者只是物质的数量,而不是每单位某物的数量。一个人在一定时期内(比如一年)可能增加的体重是物质的数量, 以公斤为单位,因此是一个广义量,而不是密度。 一个人“每天”或“每小时”增加的体重是一个强度量,密度也是如此。

举一个非密度函数的例子,考虑一下太阳能电池板在某一天(2014 年 7 月 1 日)产生的能量,假设它是 120 千焦耳。这是“东西”的数量。好吧,这很好,但它足以运行我的电脑吗? 我的电脑(如果是台式机)需要一定的能量密度或能量速率才能继续工作。那么我们如何将当天的能量转换为能量速率呢?我们可以将其划分为时间段。

2.7 曲线与曲面

曲线的几何形状,尤其是曲面的几何形状,在图形学中起着核心作用, 在这里,我们回顾一下二维和三维空间中曲线和曲面的基础知识。

2.8 线性插值

线性插值是一种数学方法,用于根据已知的离散数据点,估算这些点之间的未知数据点。 它的基本思想是:在已知数据点的连线上,通过线性关系来估计未知点的值。形象地说,就是用一条直线来连接两个已知的点,然后在这条直线上找到对应未知点的值。

2.9 三角形

2D 和 3D 中的三角形是许多图形程序中的基本建模图元。 通常,颜色等信息被标记到三角形顶点上,并且该信息在三角形上进行插值。 使这种插值变得简单的坐标系称为重心坐标;我们将从头开始开发这些坐标系。我们还将讨论 2D 三角形,在 2D 屏幕上绘制它们的图像之前,必须先理解它。

2.10 离散概率

概率研究包括随机结果和离散概率的事物

离散概率指的是随机结果的数量有限。一个典型的例子是六面骰子,骰子会从 6 中随机取值,当你掷骰子时, 每个结果出现的概率都相同。某个结果的概率是该结果发生的时间分数。某事发生的时间分数是 1。每次掷骰子出现的概率是六分之一。