快得惊人的散度定理体积计算

Hacker News Top 论文

摘要

本文介绍了一种使用散度定理计算简单、闭合、三角化三维网格体积的快速算法。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/28 12:27

# 利用散度定理实现超快速体积计算 来源:https://alyssarosenzweig.ca/blog/hilariously-fast-volume-computation-with-the-divergence-theorem.html 2018年2月16日(注意:本文不含笑话) 下文提出一种针对简单闭合三角化三维网格的快速体积计算算法。该算法基于散度定理推导得出,理论上可扩展至其他网格类型,但这超出当前讨论范围。 我们首先将体积定义为区域上的常数1三重积分: $$ V = \iiint_R 1 \, \mathrm{d}V $$ 设向量场 $$ \mathbf{F} $$ 为三维空间 $$ \mathbb{R}^3 $$ 上的函数,且其散度为1。为推导方便,本文定义: $$ \mathbf{F}(x, y, z) = \begin{pmatrix} x \\ 0 \\ 0 \end{pmatrix} $$ 易证其散度: $$ \mathrm{div} \, \mathbf{F} = \frac{\partial F}{\partial x} + \frac{\partial F}{\partial y} + \frac{\partial F}{\partial z} = 1 + 0 + 0 = 1 $$ 因此体积可改写为: $$ V = \iiint_R 1 \, \mathrm{d}V = \iiint_R \mathrm{div} \, \mathbf{F}(x, y, z) \, \mathrm{d}V $$ 根据散度定理,该体积分等于闭合曲面S上的面积分: $$ V = \iint_S \mathbf{F}(x, y, z) \, \mathrm{d}\mathbf{S} $$ 此面积分定义在三维网格的表面S上,可分解为各三角形面片的贡献之和。设第i个三角形的表面为 $$ T_i $$,则: $$ V = \sum_{i=0} \iint_{T_i} \mathbf{F}(x, y, z) \, \mathrm{d}\mathbf{S} $$ 设三角形 $$ T_i $$ 的第n个顶点为 $$ T_{in} $$,定义向量: $$ \Delta_1 = T_{i1} - T_{i0}, \quad \Delta_2 = T_{i2} - T_{i0} $$ 每个三角形 $$ T_i $$ 可参数化为: $$ \mathbf{r}(u, v) = T_{i0} + u\Delta_1 + v\Delta_2 $$ 求偏导得: $$ \mathbf{r}_u = \Delta_1, \quad \mathbf{r}_v = \Delta_2 $$ 叉乘结果为: $$ \mathbf{r}_u \times \mathbf{r}_v = \Delta_1 \times \Delta_2 $$ 将参数化表达式代入面积分,结合 $$ \mathbf{F} $$ 的定义可得: $$ V = \sum_{i=0} \iint_{T_i} \mathbf{F}(x, y, z) \cdot (\mathbf{r}_u \times \mathbf{r}_v) \, \mathrm{d}A $$ $$ = \sum_{i=0} \iint_{T_i} \begin{pmatrix} x \\ 0 \\ 0 \end{pmatrix} \cdot (\Delta_{i1} \times \Delta_{i2}) \, \mathrm{d}A $$ $$ = \sum_{i=0} \iint_{T_i} (\Delta_{i1} \times \Delta_{i2})_x \cdot x \, \mathrm{d}A $$ 由于叉乘向量在三角形区域内为常量,且与 $$ \mathbf{F} $$ 的点积仅保留x分量,可提出积分号外: $$ V = \sum_{i=0} (\Delta_{i1} \times \Delta_{i2})_x \iint_{T_i} x \, \mathrm{d}A $$ 现聚焦于面积分 $$ \iint_{T_i} x \, \mathrm{d}A $$。利用参数展开: $$ \iint_{T_i} x \, \mathrm{d}A = \int_0^1 \int_0^{1-u} \left( T_{i0x} + u\Delta_{i1x} + v\Delta_{i2x} \right) dv \, du $$ 直接计算二重积分(视顶点坐标为常数): $$ = T_{i0x} \int_0^1 \int_0^{1-u} dv \, du + \Delta_{i1x} \int_0^1 \int_0^{1-u} u \, dv \, du + \Delta_{i2x} \int_0^1 \int_0^{1-u} v \, dv \, du $$ $$ = T_{i0x} \cdot \frac{1}{2} + \Delta_{i1x} \cdot \frac{1}{6} + \Delta_{i2x} \cdot \frac{1}{6} $$ 代回向量定义 $$ \Delta_{ix} = T_{i,x} - T_{i0x} $$ 并化简: $$ = \frac{1}{6} \left( T_{i0x} + T_{i1x} + T_{i2x} \right) $$ 最终得到体积的紧凑计算公式: $$ V = \frac{1}{6} \sum_{i=0} (\Delta_{i1} \times \Delta_{i2})_x \cdot \left( T_{i0x} + T_{i1x} + T_{i2x} \right) $$ ## 性能分析 该算法完全规避了数值积分与微分。相较于传统网格体积计算(通常需渲染网格后进行采样),本算法仅需单次三角形遍历,时间复杂度为 $$ O(n) $$。 单次三角形计算仅需7次加法和3次乘法,循环外还有1次乘法。对于包含 $$ n $$ 个三角形的网格,总运算量为 $$ 8n-1 $$ 次加法、$$ 3n+1 $$ 次乘法,即 $$ 11n $$ 次浮点运算。 此效率极高。以基准估算:若需在60fps高性能应用中实时计算体积(仅依靠CPU,不依赖GPU),即便是35美元的树莓派(性能参考:https://raspberrypi.stackexchange.com/questions/55862/what-is-the-performance-and-the-performance-per-watt-of-raspberry-pi-3-in-gflops),每帧仍可处理约3000万三角形。 ## 动机 向量微积分考试临近需要复习,加之谁不爱3D图形呢? 若该算法具有创新性,那将是(令人惊喜的)。但后续查阅发现Cha Zheng与Tsuhan Chen的论文《Efficient Feature Extraction for 2D/3D Objects in Mesh Representation》(http://chenlab.ece.cornell.edu/Publication/Cha/icip01_Cha.pdf)已描述类似算法,只是推导路径不同。 推导过程很有趣,但文献先已存在。 [返回主页](https://alyssarosenzweig.ca/)

相似文章

球面Voronoi图

Hacker News Top

一个基于网页的工具,通过使用随机增量算法计算3D凸包(相当于球面上的Delaunay三角剖分),来计算并可视化球面Voronoi图。

JanusMesh: 快速零样本3D视觉幻觉生成——基于跨空间去噪

Hugging Face Daily Papers

JanusMesh 是一个快速、免训练的框架,通过将生成过程解耦为跨空间双分支去噪和视图条件纹理合成,生成文本驱动的3D视觉错觉——单个网格从不同视角展示不同语义——在仅3-5分钟内实现高真实感。

MeshFlow: 基于等变流匹配的网格生成

Hugging Face Daily Papers

MeshFlow 引入了一种等变最优传输流匹配模型,用于直接生成三角形网格,在达到最先进质量的同时,相比自回归方法提供了约18倍的推理加速。

网格上三角化无关流匹配的Matérn噪声

Hugging Face Daily Papers

本文介绍了一种三角化无关的流匹配方法,用于基于网格的信号生成,采用Matérn过程作为噪声,PoissonNet作为去噪器,在大型网格上实现了高质量结果。