Loading

【3D数学基础:图形与游戏开发】笔记 第12章 几何图元

【3D数学基础:图形与游戏开发】笔记 第12章 几何图元

参考资料&原文链接

参考书籍:【3D数学基础:图形与游戏开发】 ISBN7-302-10946XTP.7262

(美) etcher Dun著、(美) an Arberry 清华大学出版社

GAMES101-现代计算机图形学入门-闫令琪

猎豹网校:游戏开发之3D数学基础

自由度

每个几何图元都有一个固有的属性:自由度。自由度是无歧义地描述该实体所需信息量的最小数目。
有趣的是,同一几何图元,不同表示方法所用到的自由度是不同的。然而,我们会发现“多余”的自由度
数量经常是由于图元参数化中的冗余造成的,这些冗余可以通过些适当的假设条件来消除,如假设向量为单位长度。

直线和射线

直线

  • 直线向两个方向无限延伸。
  • 线段是直线的有限部分,有两个端点。
  • 射线是直线的“一半”,有一个起点并向一个方向无限延。

射线

在计算机科学和计算几何中,存在着这些定义的许多变种。本书使用“直线”和“线段”的经典定义但对“射线”的定义作出修改:

  • 射线就是有向线段。

对我们来说,射线有起点和终点。这样,一条射线定义了一个位置,一个有限长度和一个方向(除射线长度为零)。任何射线都定义了包含这个射线的一条直线和线段。射线在计算儿何和图形学中占有非常重要的位置,这是本节讨论的重点。

image-20210911173829693

image-20210911174009582

射线的表示

image-20210911174319490

球和圆

image-20210911174532947

常用公式

  • 向量c:圆心/球心。

  • p:圆/球上一点。

  • r:圆/球半径。

  • D:圆/球直径。

  • C:圆周长。

  • A:圆面积。

  • S:球表面积。

  • V:球体积。

    圆面积的微积分是圆周长,球体积的微分是球表面积。

作用

球的简单性使它在计算几何和图形学中是几乎处不在。“边界球”经常用于相交性测试中,因为检验与一个球是否相交是非常简单的。而且由于旋转一个球时并不会改变它的形状,所以使用边界球时不必考虑物体的方向。

矩形边界框(AABB)

另一种常见的用来界定物体的几何图元是矩形边界框。矩形边界框可以是与轴对齐的或是任意方向的。轴对齐矩形边界框有一个限制,就是它的边必须垂直于坐标轴。缩写AABB常用来表示 axially aligned bounding box(轴对齐矩形边界框),OBB用来表示 oriented bounding box(方向矩形边界框)。轴对齐矩形边界框不仅容易创建,而且易于使用。

image-20210911175550291

AABB的表达

边界框大小

xmin<= x <= xmax

ymin<= y <= ymax

zmin<= z <= zmax

最大顶点和最小顶点

pmin = [xmin,ymin,zmin]

pmax = [xmax,ymax,zmax]

中心点

中心点c = (pmin + pmax)/2

尺寸向量

尺寸向量s是从pmin指向pmax的向量,包含了矩形边界框的长,宽,高:

s = pmax - pmin

半径向量

半径向量r是从中心点指向pmax的向量:

r = pmax - c

= s / 2

明确地定义一个AABB只需要pmin,pmax。,c,s,r这5个向量中的两个(除s和r不能配对外,它们中的任意两个都可配对)。在一些情况下,某些配对形式比其他的会更有用。我们建议用pmin,和max表示一个边界框,因为实际应用中,使用它们的频率远高于c,s,r。当然,由pmin,和max计算其余三个中的任意一个都是很容易的。

AABB与边界球

很多情况下,AABB比边界球更适合于做定界体。

  • 计算一个点集的AABB,在编程上更容易实现,并能在较短的时间内完成。计算边界球则困
    难得多。
  • 球体一般比AABB要大。对实际世界里的许多物体,AABB提供了一种“更紧凑”的边界。当然,对于某些物体,边界球更好(设想一个本身就是球形的物体!)。在极端的情况下,AABB的体积可能仅相当于边界球体积二分之一,大部分时候边界球的体积会比矩形边界框的体积大得多,比较一下电线杆的边界球和AABB就知道了,图12.11所示为不同物体的AABB与边界球的比较。

image-20210911180816225

边界球的根本问题是它的形状只有一个自由度——半径。而AABB却有三个自由度——长、宽、高。因此,它可以调节这些自由度以适应不同物体。对图12.11中的大部分物体除了右上角的星形体外,AABB都比边界球小。对这颗星,边界球也仅比AABB略微小一些。通过图12.11,我们可以注意到AABB对物体的方向很敏感。比较下面两枝枪的AABB。图中枪的大小都是相同的,只是方向不同而已;还应注意到在这一情况下边界球大小相同,因为边界球对物体方向不敏感。

AABB变换

当物体在虚拟世界中移动时,它的AABB也需要随之移动。此时我们有两个选择用变换后的物体来重新计算AABB,或者对AABB做和物体同样的变换。所得到的结果不一定是轴对齐的(如果物体旋转),也不一定是盒状的(如果物体发生了扭曲)。不过,通过“变换后的AABB”进行计算要比通过“经过变换的物体”计算AABB快得多,因为AABB只有8个顶点。

根据变换的不同,这种方法可能使新边界框比原边界框大许多。例如,在2D中,45°的旋转会大大增加边界框的尺寸。如图 所示。

image-20210911212657337

通过“变换后的AABB“计算不能只是简单地变换8个顶点,也不能通过转换原pmax和pmin来得到新的pmax和pmin——这样可能会导致xmin>xmax、为了计算新的AABB,必须先变换8个顶点,再从这8个顶点中计算一个新的AABB,计算的方式是:

image-20210911212953711

[x',y',z']是原边界框,m那一坨是旋转矩阵,[x,y,z]代表一个点,而AABB有8个点,就要用这8个点分别和旋转矩阵相乘,然后在再其中找出最大的和最小的。

这样显然太慢了,可以用一点技巧,例如我现在要找出m11x+m21y+m31z最小的,那么我可以:

  • 若m > 0,则我用一个最小的xmin代入计算。
  • 若m < 0,则我用一个最大的xmax代入计算。

这样就能够最小化乘积。

计算最大值则与之相反。

平面

隐式定义

在3D中,平面是到两个点的距离相等的点的集合。平面完全是平的,没有厚度,且无限延伸。

例如:在点r和点q之间有一个平面,平面上有任意一点p,p到r和p到q的距离是相等的:

image-20210911213906599

平面方程:

image-20210911214011623

ax + by + cz = d :平面方程。

p:平面上任意一点。

d:原点到平面的距离。

n:法向量。

它们有如下关系:

  • p · n = d

  • n · p = d

  • n · q = d

  • n · p = n · q

  • n· ( p - q ) = 0

    这一行的几何意义就是a垂直于从q到p的向量参考点乘的几何意义)。这对于平面上的任意p,q点都是成立的。因此,n垂直于平面上的任意向量。

平面的正面和背面

我们还假设平面有“正面”和“反面”一般来说,法向量n指向的方向是平面的正面( Front side)。

image-20210911214445186

用三个点来定义

image-20210911214601828

左手坐标系。

点到平面的距离

image-20210911214854750

不在平面的一点q,与在平面上的一点p的最短距离很明显就是q垂直于平面的距离,我们将法向量n看做单位向量,给单位向量乘以a倍再加上p点就等于q点,即:q + an = q。推导公式比较简单,看图即可。注意前面推导的:p · n = d。

三角形

角形在建模和图形学中有着极其重要的位置。复杂3D物体的表面,如车或人体,都是用三角形模拟的。像这样一组相连的三角形称作三角网格第14章将详细讨论这一主题。在学习怎样操作多个角形之前,先要学会如何操作单个三角形。

角形是通过列出它的三个顶点来定义的。这些点的顺序是非常重要的,在左手坐标系中,当从三角形“正面”看时,经常以顺时针方向列出这些点。设这三个顶点为v1,v2,v3

基本关系

设lt为et的长度。注意et,、lt和vt的对应关系,vt为相应下标的顶点,它们的关系如下;

e1 = v3 - v2 l1 = ||e1||

e2 = v1 - v3 l2 = ||e2||

e3 = v2 - v1 l1 = ||e3||

正余弦公式

image-20210911220043368

三角形周长

p = l1 + l2 + l3

三角形面积

用平行四边形计算面积

image-20210911220607661

A = bh/2

用海伦公式计算三角形面积

如果不知道高,可以使用海伦公式计算面积,它只需要提供三边的长度即可。设s为周长的一半(也称作半周长),如公式12.19所示:

image-20210911220708987

海伦公式非常有用,因为它在3D中使用非常方便。

在2D中用坐标计算三角形面积

有时候,高和周长都没有直接提供,所知道的只有顶点的笛卡尔坐标。(当然,总是可以从坐标中算出边长,但在某些情况下,我们想要避免这种代价相对较高的计算。)

A = [(y1 - y3)(x2 - x3) + (y2 - y3)(x3 - x1)] / 2

在3D中用叉乘计算三角形面积

在3D中,通过叉乘来计算三角形的面积。两向量a,b叉乘的大小等于以a,b为两边的平行四边形的面积。因为三角形面积等于包围它的平行四边形的一半,所以我们有了一种简便方法。给出三角形的两个边向量,e1和e2,则三角形面积为:

A = ||e1 × e1|| / 2

三角形的特殊点

重心

image-20210911221503023

重心是三角形的最佳平衡点,它是三角形三条中线的交点(中线指从顶点到对边中点的连线)图12.23展示了一个三角形的重心。重心是三个顶点的几何均值:

image-20210911221451499

重心也被称作质心。

内心

image-20210911221537312

内心是指到三角形各边距离相等的点。之所以称作内心是因为它是三角形内切圆的圆心。内心是角平
分线的交点,如图12.24所示。

image-20210911221605826

内切圆解决了寻找与三条直线相切的圆的问题。

外心

外心是三角形中到各顶点距离相等的点,它是三角形外接圆的圆心。外心是各边垂直平分线的交点。
图12.25展示了一个三角形的外心。

image-20210911221716127

image-20210911221737132

多边形

简单多边形和复杂多边形

简单多边形不包含“洞”复杂多边形可能包含“洞”(图12.26)。简单多边形可以通过沿多边形列出所有顶点来描述(左手坐标系中,通常以从多边形正面看时的顺时针方向列出所有点)。简单多边形的使用频率比复杂多边形高得多。

image-20210911221914340

通过添加一对“接缝”边,能将任意复杂多边形转化成简单多边形,如图12.27所示。见右边的放大图,我们在每个“缝”添加了两个边。这两个边实际上是重合的,放大图中将其分开是为了让您看得更清楚。当我们考虑到绕多边形的边的顺序时,这两个接缝边的方向是相反的:

image-20210911222023628

自相交多边形

大多数简单多边形的边不相交。如果有的边相交了,那么这个多边形叫作自相交多边形。一个简单的
自相交多边形如图12.28所示:

image-20210911222105555

我们大多数时候与非自相交多边形打交道。

凸多边形和凹多边形

image-20210911222331726

多边形的基本性质

image-20210911222538131

多边形有内角,内角和 = (n - 2)× 180°,其中n为多边形的边数。例如三角形的内角和就是180°。

判断多边形是凹多边形还是凸多边形:

对于一个凸多边形,内角不会大于外角。

所以,将外角和与内角和进行比较,选取其中较小的角和:

  • 若角和 = (n - 2)× 180°,则为凸多边形。
  • 若角和 < (n - 2)× 180°,则为凹多边形。

三角分解和扇形分解

任意多边形都能分解为三角形。因此,所有对三角形的操作都能应用到多边形上。复杂、白相交、甚至简单的叫多边形的分解都不是件简单的工作,稍微超出了本书的范围。
幸运的是,简单多边形的三角分解是一件容易的事。一种显而易见的三角分解技术是选取一个点(称
作第一个点),沿着顶点按“扇形”分解多边形。给定一个有n个顶点的多边形,沿多边形列顶点v1…vn
能够很容易地构造形如{v1,vi-1,vi}的n-2个三角形,见图12.30。

image-20210911223127257

扇形三角分割会分割出一些长的,较细的三角形,这在某些情况下会引起麻烦。如同计算表面的法向量一样,数值的不精确性在度量极小的角时会造成一些问题。

一种更加“聪明”的分解方法是:连接两顶点的对角线将一个多边形分解为两部分。这时,对角线端
点处的两个内角都能分解为两个新的内角。因此,总共产生了四个新内角。为了分解多边形,选择能使这四个新内角中最小的角最大化的对角线,用这条对角线将多边形分为两个。对分割后的每一部分都递归应用这个过程直到剩下的都是三角形。

这个方法产生较少的细三角形。但是在实践中,它过于复杂。根据几何学和应用目的,扇形分解已经
足够了(并且简单得多)。

本文标签

游戏开发3D数学基础:图形与游戏开发Unreal Engine游戏开发基础数学游戏开发数学基础书籍笔记笔记

posted @ 2021-09-11 22:40  多思考多实践同等重要  阅读(527)  评论(0编辑  收藏  举报