Skip to content

几何(基本表示方法)

前面几章主要讨论的是:给定一个三角形,它如何被变换到屏幕上,如何被光栅化成片元,片元如何通过光照和纹理得到颜色。换句话说,我们一直在研究“如何把已有表面画出来”。

从本章开始,问题稍微往前退一步:这些表面本身是如何被表示的?

计算机图形学中的几何表示并不只有三角形。点云、线框、三角网格、隐式函数、参数曲面、体数据,都可以描述形状。它们关心的问题不同:有的适合扫描和重建,有的适合实时渲染,有的适合布尔运算,有的适合动画变形,有的适合医学影像和流体模拟。

本章先建立分类直觉,后续章节再深入曲线、曲面、网格处理与阴影映射等内容。


几何表示要回答三个基本问题:

  • 形状在哪里? 也就是空间中的位置、范围和边界。
  • 形状如何连接? 点与点之间是否构成边,边与边之间是否构成面,面之间是否共享拓扑关系。
  • 形状如何参与计算? 它能否被渲染、求交、变形、细分、碰撞检测、存储和传输。

同一个真实物体可以有多种表示。一个杯子可以是扫描得到的点云,可以是艺术家建模的三角网格,可以是 CAD 中的参数曲面,也可以是体素网格中的占据区域。表示方式不是“谁更真实”的问题,而是“当前任务需要什么数据结构”的问题。

不同几何表示方法的取舍地图

这张图不是严格的转换流程,而是一个记忆地图:点云强调采样,线框强调连接,三角网格强调可渲染表面,隐式表示强调边界函数,参数表示和体数据则服务于不同的建模与仿真需求。


一个重要分类是 显式表示 (Explicit Representation)隐式表示 (Implicit Representation)

显式表示会直接给出组成形状的数据。例如三角网格会明确存储顶点、边和三角形面:

Mesh=(V,E,F)Mesh = (V, E, F)

其中 VV 是顶点集合,EE 是边集合,FF 是面集合。显式表示的好处是直观、容易送入渲染管线,也容易编辑局部顶点。

隐式表示不直接列出表面上的所有点,而是用一个函数定义边界:

f(x,y,z)=0f(x, y, z) = 0

例如半径为 rr 的球可以写成:

x2+y2+z2r2=0x^2 + y^2 + z^2 - r^2 = 0

f(x,y,z)<0f(x, y, z) < 0 时,点在球内;当 f(x,y,z)>0f(x, y, z) > 0 时,点在球外;当 f(x,y,z)=0f(x, y, z) = 0 时,点在表面上。隐式表示非常适合内外判断、碰撞、布尔运算和一些程序化建模方法,但若要交给传统光栅化管线,通常还需要提取成网格。

三角网格
存储对象顶点 / 边 / 面
适合任务实时渲染
用许多三角形近似连续表面,是 GPU 最常直接消费的几何表示。
切换表示方式,观察同一个“球形表面”如何被点、边、三角形或函数约束描述。细分越高,离散表示越接近连续形状,但数据量也越大。

上面的组件展示的是同一个球形表面在不同表示中的样子。点云强调采样点,线框强调连接关系,三角网格强调可渲染表面,隐式表面强调“由函数定义边界”的思想。


点云 (Point Cloud) 是一组空间点的集合:

P={p0,p1,p2,...,pn}P = \{p_0, p_1, p_2, ..., p_n\}

每个点可以携带位置、颜色、法线、强度、时间戳等属性。点云常见于 3D 扫描、激光雷达、摄影测量和场景重建。它的优势是获取直接:传感器测到哪里,就记录哪里。

点云的问题是缺少明确连接关系。两个点是否相邻?它们之间是否应该构成一条边或一个面?表面是否有洞?这些信息通常需要后处理推断。

点云适合:

  • 表示扫描结果和测量数据。
  • 做空间重建、配准和粗略可视化。
  • 作为生成网格或隐式场的输入。

点云不太适合:

  • 直接进行传统三角形光栅化。
  • 表示光滑连续曲面上的拓扑关系。
  • 精确求交和高质量表面着色。

线框 (Wireframe) 用顶点和边描述形状:

Graph=(V,E)Graph = (V, E)

它比点云多了连接关系,但通常不直接定义填充表面。线框很适合观察模型拓扑、调试三角网格结构、显示 CAD 草图或骨架结构。

在线框模式下,一个立方体的形状非常清晰,因为边界和结构是主要信息。但对于一个复杂角色模型,只有线框并不能告诉渲染器“哪一侧是表面”“如何插值法线”“哪些区域应该遮挡后方”。因此线框更像是几何结构的辅助视图,而不是完整表面表示。


三角网格:实时渲染的中心表示

Section titled “三角网格:实时渲染的中心表示”

三角网格 (Triangle Mesh) 是实时图形中最常见的表面表示。它通常包含:

  • 顶点位置。
  • 顶点索引。
  • 三角形面。
  • 法线、UV、切线、颜色等顶点属性。

一个三角形面可以由三个顶点索引表示:

Fi=(va,vb,vc)F_i = (v_a, v_b, v_c)

GPU 喜欢三角形,是因为三角形有几个非常好的性质:任意三个不共线点确定一个平面;三角形内部可以用重心坐标稳定插值;任何多边形都可以拆成三角形;光栅化硬件也围绕三角形做了大量优化。

三角网格的核心优势是:

  • 易于送入 GPU 渲染管线。
  • 易于表达复杂形状。
  • 易于和 UV、法线、材质、骨骼动画结合。
  • 工具链成熟,几乎所有建模软件和游戏引擎都支持。

它的局限也很明显:三角网格本质上是离散近似。想让曲面更光滑,通常需要更多三角形,或者依赖法线插值、细分曲面、法线贴图等技术来改善视觉效果。


三角网格不只是“一堆三角形”。它还包含拓扑结构,也就是顶点、边、面之间如何连接。

两个网格可能拥有相似的外形,但拓扑质量完全不同。好的拓扑通常有:

  • 面片分布比较均匀。
  • 边流符合形变方向。
  • 少量不必要的长瘦三角形。
  • 合理的边界、洞和非流形结构控制。

非流形 (Non-Manifold) 是网格处理中常见问题。直观地说,如果某条边被超过两个面共享,或者某个顶点附近的面无法形成正常的局部表面,就可能产生非流形结构。它会让法线计算、布尔运算、细分、物理碰撞和打印制造变得困难。


法线、UV 与材质属性也是几何数据的一部分

Section titled “法线、UV 与材质属性也是几何数据的一部分”

讨论网格时,很容易只关注顶点位置和三角形索引。但对渲染来说,附加属性同样重要。

一个顶点常常携带:

position: vec3
normal: vec3
uv: vec2
tangent: vec4
color: vec4

其中:

  • position 决定几何在哪里。
  • normal 决定表面如何响应光照。
  • uv 决定片元从纹理哪里取数据。
  • tangent 帮助法线贴图从切线空间转换到世界空间。
  • color 可以存顶点色、遮罩或调试信息。

这也是为什么同一个低模物体可以通过平滑法线看起来更圆,通过 UV 贴图获得复杂颜色,通过法线贴图获得细小凹凸。形状的“可见外观”来自几何、属性、材质和光照共同作用。


参数表示 (Parametric Representation) 使用一个或多个参数生成空间点。曲线可以写成:

P(t)=(x(t),y(t),z(t))P(t) = (x(t), y(t), z(t))

曲面可以写成:

P(u,v)=(x(u,v),y(u,v),z(u,v))P(u, v) = (x(u, v), y(u, v), z(u, v))

例如一个圆可以用参数 tt 表示:

P(t)=(rcost,rsint)P(t) = (r\cos t, r\sin t)

参数表示非常适合曲线、曲面、路径动画和 CAD 建模。它的优点是连续、可控、数学表达清晰;缺点是要进入光栅化管线时,通常仍然需要离散采样成线段或三角网格。

后面讨论曲线与曲面时,会继续展开 Bezier 曲线、样条曲线和曲面细分这些连续几何方法。


除了表面表示,还有一类表示会描述空间体积本身。体素 (Voxel) 可以理解为空间中的三维像素。一个体数据可以存储每个小立方格中的密度、温度、颜色、占据状态或其它物理量。

体数据适合表达:

  • 医学影像中的 CT / MRI 体积。
  • 烟、云、雾、火焰等体积介质。
  • Minecraft 风格的块状世界。
  • 流体模拟和空间占据场。

体素的优点是内外和局部空间关系清晰,适合体积采样和一些布尔操作;缺点是内存成本高,分辨率越高增长越快。一个 5123512^3 的体素网格已经包含超过一亿个单元。


实际项目里,几何表示经常互相转换:

  1. 点云到网格:扫描或重建得到点云,再通过表面重建算法生成三角网格。
  2. 隐式到网格:用 Marching Cubes 等方法从隐式场或体数据中提取等值面。
  3. 参数曲面到网格:把连续曲面按一定分辨率采样,生成可渲染三角形。
  4. 高模到低模:把高细节网格简化成低模,并把细节烘焙到法线贴图或置换贴图。
  5. 网格到体素:为了碰撞、路径规划或体积计算,把表面网格转换成占据体素。

这些转换说明:几何表示不是孤立选择,而是生产流程的一部分。建模、仿真、渲染、碰撞、压缩和传输可能各自偏好不同表示。


选择几何表示时,可以从几个问题入手:

问题更常见的选择
要直接实时渲染吗?三角网格
来自扫描数据吗?点云,然后重建网格
需要精确曲线和工业设计吗?参数曲线 / 参数曲面
需要频繁做布尔和内外判断吗?隐式表示 / SDF
要表现烟雾、云或医学体数据吗?体素 / 体渲染
要低成本表现表面微细节吗?网格 + 法线贴图

一个成熟渲染系统往往会混合使用多种表示。角色模型可能是三角网格,皮肤细节来自纹理,碰撞体是简化网格或隐式形状,特效烟雾来自体数据,远景建筑又被简化成低模或公告板。


本章从整体上梳理了几何的基本表示方法。请重点记住以下结论:

  1. 几何表示描述的不只是形状在哪里,还包括连接关系、属性数据以及它能否参与渲染、求交、变形和碰撞。
  2. 点云适合扫描和重建,但缺少明确表面拓扑;线框适合观察连接结构,但不是完整表面。
  3. 三角网格是实时渲染中最常见的表示,因为它适合光栅化、插值、材质绑定和 GPU 优化。
  4. 隐式表示用 f(x,y,z)=0f(x, y, z)=0 定义表面,适合内外判断、布尔运算和程序化建模,但通常需要转换成网格才能进入传统光栅化管线。
  5. 参数曲线和参数曲面提供连续、可控的数学描述;体素和体数据则适合表达空间内部的密度或占据关系。

下一章会继续深入几何中的连续表示,重点讨论曲线与曲面如何从少量控制点生成平滑形状。