【译】GAMES101-现代计算机图形学入门:Lec10~12_几何 Geometry

90 阅读10分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情


大家好,我是曹骏。因为本人对计算机图形学、WebGPU等非常感兴趣,因此会陆续发布闫令琪博士的《GAMES101:现代计算机图形学入门》课程译文,希望能帮助到更多的同学理解课程,爱上图形学这一浪漫的学科。

先给出课程的链接:

www.bilibili.com/video/BV1X7…
www.bilibili.com/video/BV1X7…
www.bilibili.com/video/BV1X7…

1 几何的表达方式 Introduction to geometry

1.1 几何形体的例子 Examples of Geometry

  • 不同形状的杯子有着不同的几何体组成

  • 车上有光滑的曲面

  • 复杂的机械结构里有各种形状不同的零件

  • 布料由很复杂的表面结构,远看是透明的,股由纤维组成,线由股组成...

  • 水滴掉落时形成的复杂几何表面

  • 很大的场景如何简化几何,《超能陆战队》中就有大量远景城市镜头,对如何简化模型做了研究

  • 毛发形成的复杂几何结构

  • 微观几何结构

  • 树生长枝干、树叶形成的复杂几何结构

1.2 隐式几何 “Implicit” Representations of Geometry

代数曲面(Algebraic surfaces)、CSG(Constructive solid geometry)、水平集(Level set methods)、分形(Fractals)...

1.2.1 隐式几何 Implicit Surface

  • 给出点满足某些特定关系 Points satisfy some specified relationship
  • 不直观,很难判断面上的点在哪 Sampling can be hard
  • 容易判断点在内部还是外部(将点的坐标代入函数判断与0的关系) Inside/Outside tests easy
  • 通常将满足的关系化为的形式

1.2.2 代数曲面 Algebraic Surfaces

  • 表面是x、y、z的多项式的零点集 Surface is zero set of a polynomial in x, y, z

1.2.3 构造性实体几何学 CSG Constructive Solid Geometry

  • 通过布尔运算组合隐式几何 Combine implicit geometry via Boolean operations

1.2.4 距离函数 Distance Functions

  • 距离函数描述的是:空间中的任意一点到想要表述的几何形体上的任意一点的最小距离(外正或内负,空间中任何一点都定义出来一个值) giving minimum distance (could be signed distance) from anywhere to object
  • 这种方法是通过融合(Blend)距离函数的方式来描述新的物体,得到融合后的距离函数后,可以令距离函数为0时的位置为表面

  • 如下是直接融合两张图和融合距离函数的差别,融合距离函数得到的结果为0处左为黑,右为白

弹幕补充:可以想象两个磁场同时存在,找等势面的情况

1.2.5 水平集 Level Set Methods

  • 对于融合距离函数的方法,得到融合后确定的函数后,可以通过距离函数为0的地方确定为表面;对于解析式很难描述的复杂形状,替代方案是存储数值近似函数的网格,然后通过插值找出为0的表 Closed-form equations are hard to describe complex shapes. Alternative: store a grid of values approximating function
  • 可以提供对形状的更明确的控制(如纹理) Provides much more explicit control over shape (like a texture)
  • 在地理上有类似概念——等高线

  • 在CT、核磁共振等得到的医疗数据(如密度)中,可以找到使密度函数等于某个密度的集合,通过水平集的方法找到表面 Level sets encode, e.g., constant tissue density

  • 水滴在落下四溅的过程中也可以通过定义距离函数或水平集的方式表述水滴和水滴融合在一起后的表面 Level set encodes distance to air-liquid boundary

1.2.6 分形 Fractals

  • 表现出自相似性 Exhibit self-similarity, detail at all scales
  • 经常被用来描述一些自然现象 “Language” for describing natural phenomena
  • 难以控制形状 Hard to control shape!

1.2.7 隐式几何的优缺点 Implicit Representations - Pros & Cons

  • 优点 Pros:
    • 简洁的描述(如一个函数) compact description (e.g., a function)
    • 某些查询容易(物体内部,到表面的距离) certain queries easy (inside object, distance to surface)
    • 利于求光线到表面的交集  good for ray-to-surface intersection
    • 对于简单的形状,描述准确/没有采样错误 for simple shapes, exact description / no sampling error
    • 容易处理拓扑结构的变化(如流体) easy to handle changes in topology (e.g., fluid)
  • 缺点 Cons:
    • 难以创建复杂的形状 difficult to model complex shapes

1.3 显式几何 “Explicit” Representations of Geometry

三角形面(triangle meshes)、贝塞尔曲面(Bezier surfaces)、曲面细分(subdivision surfaces)、非均匀有理B样条(NURBS)、点云(Point Cloud)...

1.3.1 显式几何 Explicit Surface

  • 所有的点都直接或通过参数映射给出 All points are given directly or via parameter mapping
  • 容易判断面上的点在哪 Sampling Is Easy
  • 难以判断点在内部还是外部 Inside/Outside tests hard
  • 除了三角形面,通过参数映射定义的方法也很常见

1.3.2 点云 Point Cloud

  • 最简单的表示方法:点列表(x,y,z) Easiest representation: list of points (x,y,z)
  • 轻松表示任何类型的几何体 Easily represent any kind of geometry
  • 适用于足够大型的数据集 (>>1 点/像素) Useful for LARGE datasets (>>1 point/pixel)
  • 通常转换为多边形网格 Often converted into polygon mesh
  • 难以使用欠采样的数据进行绘制 Difficult to draw in undersampled regions

1.3.3 多边形面 Plygon Mesh

  • 存储顶点和多边形(通常是三角形或四边形) Store vertices & polygons (often triangles or quads)
  • 更容易进行处理/模拟,自适应采样 Easier to do processing / simulation, adaptive sampling
  • 更复杂的数据结构 More complicated data structures
  • 也许是图形中最常见的表示 Perhaps most common representation in graphics

  • obj格式文件经常用于图形研究 Commonly used in Graphics research
    • 是一个指定顶点、法线、纹理坐标及其连接状况的文本文件 Just a text file that specifies vertices, normals, texture coordinates and their connectivities

2 曲线 Curves

接下来从曲线开始详细说明其他显式几何表示方法

2.1 曲线的应用 Examples of Curves

  • 镜头的运动路径 Camera Paths

  • 物体沿曲线运动的动画 Animation Curves

  • 矢量文字 Vector Fonts

2.2 贝塞尔曲线 Bézier Curves

  • 贝塞尔曲线是需要一系列的控制点去定义的一个曲线,这个曲线满足一些性质,比如下图的要沿着切线方向

2.2.1 贝塞尔曲线的计算——de Casteljau Algorithm

  1. 定义三个点(二次贝塞尔曲线) Consider three points (quadratic Bezier)
  2. 根据t值在两条边上分别插值出两个点 Insert two points using linear interpolation on both edges
  3. 连接两个点再次根据t值插值 Repeat recursively
  4. t在不断取值,最终插值得到的点移动的路径即为贝塞尔曲线 Run the same algorithm for every t in

  • 三次贝塞尔曲线(Cubic Bézier Curve)也一样,类似于递归的概念


2.2.2 贝塞尔曲线的代数表示

  • de Casteljau算法给出了这样一个代数金字塔 de Casteljau algorithm gives a pyramid of coefficients

  • 三次贝塞尔曲线的代数表示如下,写出后发现各项系数正好是二项式平方 展开的结果 Example: quadratic Bézier curve from three points

  • 推广到n阶,展开项系数是一个描述二项分布的多项式(可以用伯恩斯坦公式来表达)

  • 当n=3时,我们可以用来表示三维空间中的贝塞尔曲线

  • 三次贝塞尔曲线下伯恩斯坦多项式对应图像

2.2.3 贝塞尔曲线的性质

  • 对于三次贝塞尔曲线,插值的端点:
  • 对于三次贝塞尔曲线,与端点相切的切线表示的系数为3:
  • 在仿射变换时,只需要对顶点做仿射变换,就能得到这个贝塞尔曲线在仿射变换下的结果(注意限制了时仿射变换,投影变换时不成立) Transform curve by transforming control points
  • 贝塞尔曲线在控制点形成的凸包(能够包围给定点的最小凸多边形)内 Curve is within convex hull of control points

2.2.4 分段贝塞尔曲线

  • 当控制点比较多时,贝塞尔曲线并不直观,不易控制

  • 为了便于控制曲线,可以定义多段贝塞尔曲线然后连起来,普遍习惯每四个控制点定义一段 Piecewise cubic Bézier the most common technique

2.2.5 分段贝塞尔曲线的连续性 Piecewise Bézier Curve – Continuity

  • 连续:只需要点相同

  • 连续:点相同并且切线也在一条线上

  • 连续看起来已经不错了,但不能达到工业要求

2.3 其他样条曲线 Other types of splines

2.3.1 样条 Spline

  • 样条是通过一定控制点控制的连续的曲线

2.3.2 B样条 B-splines

  • B是基函数 Short for basis splines

  • B样条具有局部性,不会像贝塞尔曲线一个点影响整个曲线 Require more information than Bezier curves

  • 满足贝塞尔曲线具有的所有重要属性(即超集) Satisfy all important properties that Bézier curves have (i.e. superset)

  • 本课程没有再详细讲解B样条和非连续性NURBS,推荐了胡事民老师的课

3 曲面

3.1 贝塞尔曲面 Bézier Surfaces

  • 贝塞尔曲面和 4 x 4 控制点阵列 Bezier surface and 4 x 4 array of control points

  • 贝塞尔曲面是由两次贝塞尔曲线得到的

3.2 贝塞尔曲面的计算 Evaluating Bézier Surfaces

  1. 使用de Casteljau算法分别计算四条贝塞尔曲线的在u时间上的位置,得到这条移动贝塞尔曲线的4个控制点 Use de Casteljau to evaluate point u on each of the 4 Bezier curves in u. This gives 4 control points for the “moving” Bezier curve
  2. 使用一维的de Casteljau算法计算这条移动贝塞尔曲线在v时间上的位置 Use 1D de Casteljau to evaluate point v on the “moving” curve

  1. 通过把映射到表面,计算出表面的位置 Evaluate surface position corresponding to (u,v)

  • 方法:分离的一维的de Casteljau计算 Method: Separable 1D de Casteljau Algorithm

4 几何处理

4.1 网格细分

4.1.1 Loop细分

  1. 连接各边中点,一个三角形会被分为4个三角形

  1. 根据新/旧顶点权重不同,更新顶点位置
    • 新顶点位置更新为3/8 (A + B) + 1/8 (C + D)

    • 旧顶点位置更新为

顶点的度(vertex degree)是这个顶点上连接边的数量

  • Loop细分的结果

4.1.2 Catmull-Clark细分

Loop细分只能用于三角形网格,但是Catmull-Clark细分可以定义四边形面与非四边形面

  1. 度不为4的点,定义为奇异点,图中有2个奇异点
  2. 在一次细分过程中,取边上的中点和面中心上的一个点,把这些点连起来
  3. 一次细分结束后,引入了两个度为3的奇异点(两个三角形中点的点),一共有4个奇异点;也就是说一次Catmull-Clark细分会将非四边形面都变为四边形,并且每一个非四边形面消失,就会引入一个新的奇异点
  4. 继续细分,奇异点数目不变

  • 具体操作

  • 两种细分方法收敛结果的对比 Convergence: Overall Shape and Creases

4.2 网格简化 Mesh Simplification

目的:在保持整体形状的同时减少网格元素的数量

4.2.1 边坍缩 Collapsing An Edge

其中一种方法:二次度量误差 Quadric Error Metrics

  • 二次误差:新顶点的位置应该使得与先前的边(面)的距离平方之和最小

  • 简单假设每一条边如果坍缩会导致多大的二次度量误差,然后从二次度量误差最小的开始坍缩
  • 但是坍缩一条边后会改变其他的边的位置,其他边的二次度量误差也必须重新算,所以我们需要每次坍缩完二次度量误差最小的边后,动态的更新其他受影响的边,需要使用到的数据结构是优先队列/堆
  • 通过对局部进行最优解,试图找到全局的最优解,这是一个典型的贪心算法
  • 使用二次度量误差的简化结果 Quadric Error Mesh Simplification