几何(基本表示方法)
前面几章主要讨论的是:给定一个三角形,它如何被变换到屏幕上,如何被光栅化成片元,片元如何通过光照和纹理得到颜色。换句话说,我们一直在研究“如何把已有表面画出来”。
从本章开始,问题稍微往前退一步:这些表面本身是如何被表示的?
计算机图形学中的几何表示并不只有三角形。点云、线框、三角网格、隐式函数、参数曲面、体数据,都可以描述形状。它们关心的问题不同:有的适合扫描和重建,有的适合实时渲染,有的适合布尔运算,有的适合动画变形,有的适合医学影像和流体模拟。
本章先建立分类直觉,后续章节再深入曲线、曲面、网格处理与阴影映射等内容。
几何表示解决什么问题
Section titled “几何表示解决什么问题”几何表示要回答三个基本问题:
- 形状在哪里? 也就是空间中的位置、范围和边界。
- 形状如何连接? 点与点之间是否构成边,边与边之间是否构成面,面之间是否共享拓扑关系。
- 形状如何参与计算? 它能否被渲染、求交、变形、细分、碰撞检测、存储和传输。
同一个真实物体可以有多种表示。一个杯子可以是扫描得到的点云,可以是艺术家建模的三角网格,可以是 CAD 中的参数曲面,也可以是体素网格中的占据区域。表示方式不是“谁更真实”的问题,而是“当前任务需要什么数据结构”的问题。
这张图不是严格的转换流程,而是一个记忆地图:点云强调采样,线框强调连接,三角网格强调可渲染表面,隐式表示强调边界函数,参数表示和体数据则服务于不同的建模与仿真需求。
显式表示与隐式表示
Section titled “显式表示与隐式表示”一个重要分类是 显式表示 (Explicit Representation) 和 隐式表示 (Implicit Representation)。
显式表示会直接给出组成形状的数据。例如三角网格会明确存储顶点、边和三角形面:
其中 是顶点集合, 是边集合, 是面集合。显式表示的好处是直观、容易送入渲染管线,也容易编辑局部顶点。
隐式表示不直接列出表面上的所有点,而是用一个函数定义边界:
例如半径为 的球可以写成:
当 时,点在球内;当 时,点在球外;当 时,点在表面上。隐式表示非常适合内外判断、碰撞、布尔运算和一些程序化建模方法,但若要交给传统光栅化管线,通常还需要提取成网格。
上面的组件展示的是同一个球形表面在不同表示中的样子。点云强调采样点,线框强调连接关系,三角网格强调可渲染表面,隐式表面强调“由函数定义边界”的思想。
点云:只有采样点
Section titled “点云:只有采样点”点云 (Point Cloud) 是一组空间点的集合:
每个点可以携带位置、颜色、法线、强度、时间戳等属性。点云常见于 3D 扫描、激光雷达、摄影测量和场景重建。它的优势是获取直接:传感器测到哪里,就记录哪里。
点云的问题是缺少明确连接关系。两个点是否相邻?它们之间是否应该构成一条边或一个面?表面是否有洞?这些信息通常需要后处理推断。
点云适合:
- 表示扫描结果和测量数据。
- 做空间重建、配准和粗略可视化。
- 作为生成网格或隐式场的输入。
点云不太适合:
- 直接进行传统三角形光栅化。
- 表示光滑连续曲面上的拓扑关系。
- 精确求交和高质量表面着色。
线框:强调连接关系
Section titled “线框:强调连接关系”线框 (Wireframe) 用顶点和边描述形状:
它比点云多了连接关系,但通常不直接定义填充表面。线框很适合观察模型拓扑、调试三角网格结构、显示 CAD 草图或骨架结构。
在线框模式下,一个立方体的形状非常清晰,因为边界和结构是主要信息。但对于一个复杂角色模型,只有线框并不能告诉渲染器“哪一侧是表面”“如何插值法线”“哪些区域应该遮挡后方”。因此线框更像是几何结构的辅助视图,而不是完整表面表示。
三角网格:实时渲染的中心表示
Section titled “三角网格:实时渲染的中心表示”三角网格 (Triangle Mesh) 是实时图形中最常见的表面表示。它通常包含:
- 顶点位置。
- 顶点索引。
- 三角形面。
- 法线、UV、切线、颜色等顶点属性。
一个三角形面可以由三个顶点索引表示:
GPU 喜欢三角形,是因为三角形有几个非常好的性质:任意三个不共线点确定一个平面;三角形内部可以用重心坐标稳定插值;任何多边形都可以拆成三角形;光栅化硬件也围绕三角形做了大量优化。
三角网格的核心优势是:
- 易于送入 GPU 渲染管线。
- 易于表达复杂形状。
- 易于和 UV、法线、材质、骨骼动画结合。
- 工具链成熟,几乎所有建模软件和游戏引擎都支持。
它的局限也很明显:三角网格本质上是离散近似。想让曲面更光滑,通常需要更多三角形,或者依赖法线插值、细分曲面、法线贴图等技术来改善视觉效果。
网格拓扑:不仅是三角形数量
Section titled “网格拓扑:不仅是三角形数量”三角网格不只是“一堆三角形”。它还包含拓扑结构,也就是顶点、边、面之间如何连接。
两个网格可能拥有相似的外形,但拓扑质量完全不同。好的拓扑通常有:
- 面片分布比较均匀。
- 边流符合形变方向。
- 少量不必要的长瘦三角形。
- 合理的边界、洞和非流形结构控制。
非流形 (Non-Manifold) 是网格处理中常见问题。直观地说,如果某条边被超过两个面共享,或者某个顶点附近的面无法形成正常的局部表面,就可能产生非流形结构。它会让法线计算、布尔运算、细分、物理碰撞和打印制造变得困难。
法线、UV 与材质属性也是几何数据的一部分
Section titled “法线、UV 与材质属性也是几何数据的一部分”讨论网格时,很容易只关注顶点位置和三角形索引。但对渲染来说,附加属性同样重要。
一个顶点常常携带:
position: vec3normal: vec3uv: vec2tangent: vec4color: vec4其中:
position决定几何在哪里。normal决定表面如何响应光照。uv决定片元从纹理哪里取数据。tangent帮助法线贴图从切线空间转换到世界空间。color可以存顶点色、遮罩或调试信息。
这也是为什么同一个低模物体可以通过平滑法线看起来更圆,通过 UV 贴图获得复杂颜色,通过法线贴图获得细小凹凸。形状的“可见外观”来自几何、属性、材质和光照共同作用。
参数表示:用参数生成点
Section titled “参数表示:用参数生成点”参数表示 (Parametric Representation) 使用一个或多个参数生成空间点。曲线可以写成:
曲面可以写成:
例如一个圆可以用参数 表示:
参数表示非常适合曲线、曲面、路径动画和 CAD 建模。它的优点是连续、可控、数学表达清晰;缺点是要进入光栅化管线时,通常仍然需要离散采样成线段或三角网格。
后面讨论曲线与曲面时,会继续展开 Bezier 曲线、样条曲线和曲面细分这些连续几何方法。
体数据与体素
Section titled “体数据与体素”除了表面表示,还有一类表示会描述空间体积本身。体素 (Voxel) 可以理解为空间中的三维像素。一个体数据可以存储每个小立方格中的密度、温度、颜色、占据状态或其它物理量。
体数据适合表达:
- 医学影像中的 CT / MRI 体积。
- 烟、云、雾、火焰等体积介质。
- Minecraft 风格的块状世界。
- 流体模拟和空间占据场。
体素的优点是内外和局部空间关系清晰,适合体积采样和一些布尔操作;缺点是内存成本高,分辨率越高增长越快。一个 的体素网格已经包含超过一亿个单元。
不同表示之间的转换
Section titled “不同表示之间的转换”实际项目里,几何表示经常互相转换:
- 点云到网格:扫描或重建得到点云,再通过表面重建算法生成三角网格。
- 隐式到网格:用 Marching Cubes 等方法从隐式场或体数据中提取等值面。
- 参数曲面到网格:把连续曲面按一定分辨率采样,生成可渲染三角形。
- 高模到低模:把高细节网格简化成低模,并把细节烘焙到法线贴图或置换贴图。
- 网格到体素:为了碰撞、路径规划或体积计算,把表面网格转换成占据体素。
这些转换说明:几何表示不是孤立选择,而是生产流程的一部分。建模、仿真、渲染、碰撞、压缩和传输可能各自偏好不同表示。
如何选择几何表示
Section titled “如何选择几何表示”选择几何表示时,可以从几个问题入手:
| 问题 | 更常见的选择 |
|---|---|
| 要直接实时渲染吗? | 三角网格 |
| 来自扫描数据吗? | 点云,然后重建网格 |
| 需要精确曲线和工业设计吗? | 参数曲线 / 参数曲面 |
| 需要频繁做布尔和内外判断吗? | 隐式表示 / SDF |
| 要表现烟雾、云或医学体数据吗? | 体素 / 体渲染 |
| 要低成本表现表面微细节吗? | 网格 + 法线贴图 |
一个成熟渲染系统往往会混合使用多种表示。角色模型可能是三角网格,皮肤细节来自纹理,碰撞体是简化网格或隐式形状,特效烟雾来自体数据,远景建筑又被简化成低模或公告板。
本章从整体上梳理了几何的基本表示方法。请重点记住以下结论:
- 几何表示描述的不只是形状在哪里,还包括连接关系、属性数据以及它能否参与渲染、求交、变形和碰撞。
- 点云适合扫描和重建,但缺少明确表面拓扑;线框适合观察连接结构,但不是完整表面。
- 三角网格是实时渲染中最常见的表示,因为它适合光栅化、插值、材质绑定和 GPU 优化。
- 隐式表示用 定义表面,适合内外判断、布尔运算和程序化建模,但通常需要转换成网格才能进入传统光栅化管线。
- 参数曲线和参数曲面提供连续、可控的数学描述;体素和体数据则适合表达空间内部的密度或占据关系。
下一章会继续深入几何中的连续表示,重点讨论曲线与曲面如何从少量控制点生成平滑形状。