跳转至

Lecture 10: Geometry 1 (Introduction)

几何表示概述

在计算机图形学中,如何表示三维几何形状是一个基本问题。主要分为两大类:隐式表示(Implicit)显式表示(Explicit)

特性 隐式表示 显式表示
表达方式 \(f(x,y,z)=0\) 的形式 直接给出点的位置
内外判断 容易(代入看符号) 困难
采样渲染 困难 容易
布尔运算 容易 困难
拓扑变化 自然处理 需要额外处理

Implicit Representation

隐式表示法使用一个函数来表示几何图形。如一个球,可以表示为:

\[ f(x, y, z) = x^2 + y^2 + z^2 - r^2 = 0 \]

隐式表示难以进行渲染,但很方便进行布尔运算,如两个球的并集、交集等,也可以方便地判断点是否在图形内部。

隐式表示的布尔运算

给定两个隐式曲面 \(f(\mathbf{x}) = 0\)\(g(\mathbf{x}) = 0\),可以通过如下方式构造布尔运算:

  • 并集(Union)\(h(\mathbf{x}) = \min(f(\mathbf{x}), g(\mathbf{x})) = 0\)
  • 交集(Intersection)\(h(\mathbf{x}) = \max(f(\mathbf{x}), g(\mathbf{x})) = 0\)
  • 差集(Difference)\(h(\mathbf{x}) = \max(f(\mathbf{x}), -g(\mathbf{x})) = 0\)

这就是 构造实体几何(CSG) 的数学基础。

常见的隐式表示形式:

多项式方程 \(f(x,y,z) = 0\),如球面、圆柱面、圆锥面。

用一组基函数的和来定义表面,适合模拟液态、有机形状:

\[ f(\mathbf{x}) = \sum_i a_i \cdot e^{-\left\lVert \mathbf{x} - \mathbf{c}_i \right\rVert^2 / \sigma_i^2} - T = 0 \]

其中 \(\mathbf{c}_i\) 是各球体中心,\(T\) 是阈值。

\(f(\mathbf{x})\) 的值等于点 \(\mathbf{x}\) 到表面的最短距离(内部为负,外部为正),零等值面 即为几何表面。


Explicit Representation

显式表示法使用顶点、边、面等基本元素来表示几何图形。常见的显式表示法有多边形网格(polygon mesh)、曲面(surface)等。

所有的点都是直接给出或者通过参数映射给出。

如:

\[ f(u, v) = (x(u, v), y(u, v), z(u, v)) \]

显式表示法便于渲染,但不方便进行布尔运算,也不方便判断点是否在图形内部。

实际应用中要根据实际需求选择合适的表示法。

多边形网格(Polygon Mesh)

在实时渲染中,最常用的显式表示是 三角形网格。它由以下元素组成:

  • 顶点(Vertex):空间中的点,存储位置坐标
  • 边(Edge):连接两个顶点的线段
  • 面(Face):由三条或更多边围成的多边形(通常为三角形)

存储结构通常使用 索引数组(Indexed Face Set):一个顶点数组 + 一个索引数组,避免重复存储共享顶点。


Constructive Solid Geometry (CSG)

构造实体几何(CSG)使用布尔运算来构建复杂的几何图形。常见的布尔运算有并集、交集和差集。

graph TD
    A["基本体素\n(球、立方体、圆柱等)"] --> B["并集 (Union)"]
    A --> C["交集 (Intersection)"]
    A --> D["差集 (Difference)"]
    B --> E["复杂几何体"]
    C --> E
    D --> E

CSG 通常以 二叉树 的形式组织:叶节点是基本体素,内部节点是布尔运算。渲染时从根节点递归求值。


Distance Function

距离函数(Distance Function) 用于表示几何图形的距离信息。对于一个点 \((x, y, z)\),距离函数 \(f(x, y, z)\) 表示该点到几何图形表面的最短距离。

可以用于混合一个移动的边界。比如A情况下,边界移动了 \(\frac{1}{3}\),B情况下,边界移动了 \(\frac{2}{3}\),那么可以通过距离函数来混合这两种情况,得到一个新的边界,结果为边界移动了 \(\frac{1}{2}\)

找到距离函数的零点即可得到边界。

距离函数的混合操作

给定两个几何体的 符号距离函数 \(f(\mathbf{x})\)\(g(\mathbf{x})\),可以通过插值实现平滑过渡(Blend):

\[ h(\mathbf{x}) = (1 - t) \cdot f(\mathbf{x}) + t \cdot g(\mathbf{x}) \]

其中 \(t \in [0, 1]\) 控制混合比例。这种方法在动画中非常有用——可以实现一个物体平滑变形为另一个物体的效果。

与 CSG 的硬布尔运算不同,距离函数混合产生的是 光滑过渡面,适合模拟有机形状。


Level Sets

水平集(Level Sets) 用于表示几何图形的等值面。对于一个距离函数 \(f(x, y, z)\),其水平集 \(f(x, y, z) = c\) 表示距离为 \(c\) 的等值面。

在CT扫描中,可以通过水平集来重建三维图像。

水平集在医学影像中的应用

CT 扫描得到的是逐层的密度数据,将这些数据看作三维标量场,取适当的等值面(如骨骼密度阈值),即可重建出器官的三维表面。这就是 Marching Cubes 算法的基本思路。


Fractals

分形(Fractals) 是自相似的几何图形,可以通过递归的方法来生成。常见的分形有曼德布罗集(Mandelbrot Set)、朱利亚集(Julia Set)等。

分形的核心特征是 自相似性——无论放大多少倍,局部结构与整体结构相似。


表示方法对比

表示方法 类型 优点 缺点 典型应用
代数曲面 隐式 布尔运算简单 复杂形状难表达 基本体素
距离函数 / SDF 隐式 混合平滑、内外判断快 精确求交困难 体素渲染、CSG
多边形网格 显式 GPU 渲染高效 布尔运算复杂 实时渲染
点云 显式 采集方便 无拓扑信息 三维扫描
参数曲面 显式 光滑连续 交线计算复杂 CAD 建模