所以我一直在研究平滑粒子流体动力学 (SPH) 模拟,我正在尝试实现 Marching Cubes (MC) 算法来可视化我的 SPH 输出。我通过阅读对 MC 算法的理解已经足够好,但是通常讨论它假设您已经有一些标量场,您可以使用它来将您的体素分类为您尝试的上方、下方或边界表面上创建(在我的情况下,这相当于检查体素是在流体表面之上、之下还是之上)。这里的关键部分是很容易检查任何立方体顶点的标量字段的值。
但是,对于我的 SPH 输出数据,我没有一些好的标量字段可供使用。相反,我的域中有很多粒子分布(随机或随意)。我知道这些随机点的每个粒子密度,但我不知道 MC 网格顶点的密度。例如考虑简单的 2d 示例:
每个蓝点代表一个粒子。执行 SPH 求解后,我知道每个粒子在这些点的位置、速度和密度。现在,为了将每个体素分类为高于、低于或在流体表面上,我需要知道体素顶点(即红点)的密度。如果您知道蓝色粒子的密度,这通常是如何完成的?
我最初的想法是用与 SPH 模拟相同的方式计算红点处的密度。在这种情况下,我会使用:
时的每个体素顶点。在下图中,这意味着绿色粒子将用于计算体素顶点密度值:
现在我对这种方法的担忧/怀疑如下:
- 我们在这里使用的值可能小于值,因为我们想要一个精细的体素网格以允许精细的表面重建。
- 考虑到上述观点,即使在 3D 中使用适度的体素网格,这也会产生超过 200 万个顶点(64*64*64*8)。
- 以这种方式计算实际 SPH 模拟中的密度有些昂贵,但至少我们可能只对 O(100k) 粒子进行计算。在这里,尽管如上所述,我们需要花费超过 200 万。我担心这会超过实际的模拟时间。
所以我的问题如下:
- 这种方法合理/正确吗?如果不是,我应该如何分类我的体素?
- 如果它是正确的,你会不会只使用一个大小为 64*64*64*8 的大数组来存储每个体素顶点的每个密度值?
注意:正如标题中提到的,我使用的是 CUDA,所以请记住这一点。

