几何(geometry)

几何

几何物体的表现形式

隐式(Implicit)
  1. 代数平面(algebraic surface)
  2. 水平集(level sets)
  3. 距离函数(distance functions)
  4. ...
优缺点

优点:

  1. 描述简洁(如,一个函数)
  2. 便于某些查询(判定物体内部,或内部点到表面的距离)
  3. 便于计算光线到表面的交集
  4. 对于简单的形状能够做到准确描述无抽样误差
  5. 易于处理拓扑变化(如,流体)

缺点:

  1. 难以模拟复杂的形状
基于一系列满足特定关系的点

例如:

球体:所有的点在三维坐标系里满足$$x^2 + y^2 + z^2 = 1$$或$$f(x,y,z) = 0 $$

难以采样

例如:

在一系列符合下列条件的点中,难以采样到符合$f(x,y,z) = 0$的点

$$f(x,y,z) = (2 - \sqrt{x^2 + y^2})^2 + z^2 - 1$$

对应的几何形状如下图

易于判断内外关系

例如:

在一系列符合下述条件的点中

$$f(x,y,z) = x^2 + y^2 + z^2 - 1$$

对于点$(\frac{3}{4},\frac{1}{2},\frac{1}{4})$ 若要判定其是否在该几何体内部则只需计算$$f(x,y,z) = - \frac{1}{8} < 0$$ 即可判定其位于几何体内部


代数平面(Algebraic Surfaces)

表面是x,y,z中多项式的零集

构造实体几何(Constructive Solid Geometry)

通过布尔计算组合构造隐式几何

距离函数(Distance Functions)

距离函数:从任意位置到目标物体给出最小距离(符号距离)

使用距离函数将两个曲面混合在一起

水平集(Level Set Method)

封闭式的方程难以描述复杂的形状

解决方案:存储值相似的函数网格

插值为零的值的位置即为表面

优势:能够提供对形状更明确的控制(如纹理)

在流体仿真中也存在应用:计算到气液边界的距离

分形(Factals)

该几何形状表现为所有尺度的细节都存在自相似性(一种描述自然现象的说法),往往难以控制形状


显式(Explicit)
  1. 点云(point cloud)
  2. 多边形网格(polygon mesh)
  3. 细分曲面和曲线(subdivision, NURBS)
  4. ...
点直接或参数映射给出

例如:

$$f:R^2 \rightarrow R^3;(u,v) \rightarrow (x,y,z)$$

易于采样

例如:

对于$$ f(u,v) = ((2 + \cos u)\cos v,(2 + \cos u)\sin v,\sin u) $$

若要判定点$f(u,v)$是否位于表面,则只需将$(u,v)$的值相加

难以判断内外关系

例如: 对于$$f(u,v) = (\cos u \sin v ,\sin u \sin v,\cos v)$$

难以判定点$(\frac{3}{4},\frac{1}{2},\frac{1}{4})$


点云 (Point Cloud)
  1. 最简单的表示:点列表(x,y,z)
  2. 轻松表现任何类型的几何图形
  3. 适用于大型数据集(>> 1 点/像素)
  4. 通常转换为多边形网格
  5. 难以用于采样不足的区域

多边形网格(Polygon Mesh)
  1. 存储顶点和多边形(通常是三角形或四边形)
  2. 更易于进行处理/模拟,自适应采样
  3. 更复杂的数据结构
  4. 图形中最常见的表示形式


表现形式应根据目标几何模型选择最合适的类型,没有最好的表现形式


贝塞尔曲线(Bézier Curves)

定义

贝塞尔曲线完全由其控制点决定其形状,$n$个控制点对应着$n-1$阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

de Casteljau Algorithm(图形)

假设存在三个点(quadratic Bezier)

通过线性插值的方式插入一个点

在另一边也通过同样方式插入一个点

递归重复

对于在$[0,1]$区间的每个t点都使用相同算法进行计算

构造一个三次方贝塞尔曲线需要总共四个输入,都递归使用线性插值

可视化算法流程

de Casteljau Algorithm(数学公式)

de Casteljau 算法给出各点间金字塔型的变量关系

推导流程

$$b_0^1(t) = (1 - t)b_0 + tb_1$$ $$b_1^1(t) = (1 - t)b_1 + tb_2$$ $$b_0^2(t) = (1 - t)b_0^1 + tb_1^1$$ $$b_0^2(t) = (1 - t)^2b_0 + 2t(1 - t)b_1 + t^2b_2$$

进而推得$n$阶贝塞尔曲线的公式为:

$$b^n(t) = b_0^n(t) = \sum_{j=0}^{n} {b_j B_j^n(t)}$$

$b^n(t)$:贝塞尔曲线阶级数n(n次向量多项式)

$b_j$:控制点($R^N$的向量)

$B_j^n$:伯恩斯坦多项式

伯恩斯坦多项式(Bernstein polynomial):

$$B_i^n(t) = \begin{pmatrix} n \\ t \end{pmatrix} t^i(1 - t)^{n - i}$$

例如$n = 3$时

我们在三维空间里有下列控制点

$b_0 = (0,2,3),b_1 = (2,3,5),b_2 = (6,7,9),b_3 = (3,4,5)$

这些点定义了以下列公式形式的贝塞尔曲线

$$b^n(t) = b_0(1 - t)^3 + b_1 3t(1 - t)^2 + b_2 3t^2(1 - t) + b_3 t^3$$

贝塞尔基本函数

插值端点:$b(0) = b_0;b(1) = b_3$

与末端线段相切:$b'(0) = 3(b_1 - b_0); b'(1) = 3(b_3 - b_2)$

能够通过控制点的位置来改变曲线

分段贝塞尔曲线

出现原因:高阶贝塞尔曲线有多个控制点,难以控制曲线形状

对策: 将多个低阶的贝塞尔曲线相连,构造为分段贝塞尔曲线

常用于:字体,路径,插画,主题演讲

样例:

组合计算

要将一下两条贝塞尔曲线组合在一起则

$$a:[k,k+1] \rightarrow IR^N$$ $$b:[k+1,k+2] \rightarrow IR^N$$

$c^0$处的连续性:$a_n = b_0$

$c^1$处的连续性:$a_n = b_0 = \frac{1}{2}(a_{n-1} + b_1)$


贝塞尔表面(Bézier Surfaces)

对于一个双立方贝塞尔表面贴片

输入:$4 \times 4 $ 控制点

输出:由$[0,1]^2$ 参数化的2D平面

计算方法

目标:计算相对于(u,v)的平面位置

  1. 使用 de Casteljau 算法来计算四条贝塞尔曲线上各自的U,这将会为"移动"贝塞尔曲线提供4个有效的控制点
  2. 使用一阶 de Casteljau 算法来计算"移动"曲线上的点V

可视化计算流程:

曲面处理(Mesh Operations)

曲面细分(Mesh Subdivision)

目的:提高分辨率

通常做法:

  1. 创建更多三角形(顶点)
  2. 更新它们的位置
Loop Subdivision
  1. 将每个三角形划分为4个三角形
  2. 根据权重更新顶点的位置(新旧顶点各自以不同方式进行更新)

新顶点:

白点即为新顶点,其位置为周围四个顶点的权重之和

旧顶点:

白色旧顶点也是自身及邻接顶点的权重之和,权重的设置与旧顶点度数关联

Catmull-Clark Subdivision

定义:

  1. 所有非四边形的面都称为Non-quad face
  2. 所有度不为4的点称为奇异点
  3. 每次细分时在每个面中添加一个点,每条边的中点也都添加一个点,面上的新顶点连接所有边上的新顶点

第一次细分后结果:

特点:

  1. 非四边形面的数量与奇异点相同,即现在共有$2+2=4$个
  2. 奇异点的度数与原来所在面的边数相等,即这里为3度
  3. 第一次细分后所有的面都会变成四边形,且后续奇异点数目不再增加

Catmull-Clark 顶点更新规则

收敛性:整体形状和折痕

曲面简化(Mesh Simplification)

目的:降低分辨率的同时尽量保持形状/外观

边坍缩

边坍缩是曲面简化的常用方法,如上图所示将一条边的两个顶点合成为一个顶点,出于尽量保持形状的目的,需要正确选择不影响或影响最小的边进行坍缩,由此引入二次误差度量(Quadric Error Metrics)

二次误差度量(Quadric Error Metrics)

坍缩之后蓝色新顶点所在位置与原来各个平面的垂直距离之和,如此误差最小则整个模型样貌修改一定程度也会较小

曲面简化算法流程
  1. 为模型每条边赋值,其值为坍缩后代替老顶点产生的新顶点所得到的最小二次误差
  2. 选取权重最小的边做坍缩,新顶点的位置为原计算得出使二次误差值最小的位置
  3. 坍缩之后,会改动与之相连的其他边,更新这些边的权值
  4. 重复步骤,直到符合终止条件

符合贪心算法标准,无法获得最优解,但效果依旧合适


纹理映射(Shadow Mapping)

Shadow Mapping是一种基于图像的算法

  1. 阴影计算期间无需进行几何体计算
  2. 必须进行反走样处理
  3. 不在阴影中的点必须同时在灯光和相机范围内
计算流程

阴影映射总体需要两个pass

Pass1:render from light

  1. 获得从光源视角得到的深度图像

Pass2:render from eye

  1. 从观看视角(相机视角)获得带有深度的标准图像
  2. 将观看视角中的可见点投影回光源
    1. 光源和观看视角的下的深度相同时为可见
    2. 光源和观看视角下的深度不相同则为被阻挡