14个版本 (9个破坏性版本)
0.10.0 | 2023年9月25日 |
---|---|
0.9.2 | 2023年5月25日 |
0.9.0 | 2023年4月18日 |
0.8.0 | 2021年9月17日 |
0.1.2 | 2020年9月3日 |
#223 in 渲染
每月77次 下载
用于 splashsurf
710KB
13K SLoC
splashsurf_lib
SPH粒子数据的表面重建库
该库主要由 splashsurf
命令行工具使用,该工具也可在crates.io上找到。
有关CLI的更多信息,请参阅仓库根目录下的readme。
内容
使用方法
使用顶级函数 reconstruct_surface
从粒子位置执行重建
pub fn reconstruct_surface<I: Index, R: Real>(
particle_positions: &[Vector3<R>],
parameters: &Parameters<R>,
) -> Result<SurfaceReconstruction<I, R>, ReconstructionError<I, R>>
有关使用方法的更多信息,请参阅docs.rs上关于crate的文档。
该库重新导出 nalgebra
以避免为库的用户引入版本冲突。
特性标志
默认情况下,以下特性均未启用,以减少此库引入的依赖。以下特性标志可用于 splashsurf_lib
- vtk-extras:启用便利特性和辅助函数,将库返回的网格类型转换为
vtkio
数据结构(特别是UnstructuredGridPiece
),这些结构可用于轻松地将网格写入VTK文件(例如,使用Paraview查看)。请查阅vtkio
的文档或splashsurf
CLI的相应io模块以获取参考。 - profiling:启用使用
coarse-prof
进行库分析。库中的几个函数将使用profile!
宏,并将函数名作为参数来记录其运行时间。用户可以使用由coarse-prof
crate提供的函数获取分析数据。请注意,使用此crate进行分析可能会降低具有非常少粒子(即只有几百个)的表面重建的性能。
对于每个功能,splashsurf_lib
重新导出相应的依赖项,以避免库用户的版本冲突。
表面重建过程
目前,仅实现了一种基于“空间哈希”策略的方法。
简要概述:使用空间哈希在每个流体粒子的支持半径内评估或映射流体密度到稀疏网格上。这意味着仅在流体密度非零的区域分配内存。这与一个天真方法不同,该方法为整个域分配了marching cubes背景网格。最后,仅在边穿过表面阈值的网格单元上执行marching cubes重建。在marching cubes阶段跳过完全位于流体内部的单元。
各个步骤:
- 构建一个具有marching cubes算法所需分辨率的“虚拟背景网格”。最后,该过程将在虚拟网格的每条边上放置一个表面网格顶点,流体表面穿过边(或者说,流体密度穿过指定的阈值)。虚拟的意思是实际上尚未为该网格分配存储;只是后来隐式地使用了其拓扑结构。
- 计算每个流体粒子的密度
- 执行邻域搜索
- 对每个粒子,通过对其邻居进行SPH求和来评估其密度(基于内核半径和粒子静止质量的输入参数)
- 可选:如果用户提供了“溅射检测半径”,则过滤掉(或者更确切地说是将它们标记为非活动状态)单个粒子。这是通过使用溅射检测半径而不是内核半径执行额外的邻域搜索来完成的。
- 计算“稀疏密度图”:一个从虚拟背景网格顶点索引到相应流体密度值的映射。该映射将只包含流体密度非零的顶点的条目。图的构建
- 迭代所有活动粒子
- 对每个粒子,在其可以影响的所有虚拟背景顶点上评估其内核
- 将相应的密度贡献(内核值乘以粒子密度)添加分配到密度图中的顶点条目
- 在每个虚拟背景单元的顶点上插值密度值到边上的点,边穿过流体表面
- 迭代稀疏密度图中的所有顶点
- 跳过密度值高于考虑为流体内部阈值的顶点
- 对于剩余的每个顶点,检查是否有任何相邻顶点(即通过虚拟背景网格的边直接连接到它的顶点)高于阈值
- 如果是这样,就找到了穿过流体表面的边,可以使用线性插值计算边上的表面位置
- 这个插值位置存储在一个新映射中,该映射将虚拟背景单元格的索引映射到包含每条边表面交叉点的结构。只有实际穿过表面的单元格才会创建条目
- 使用Marching cubes案例表对边上的点进行三角化
- 遍历单元格数据映射中的所有单元格
- 对于每个单元格,在Marching cubes LUT中查找相应的三角化
- 将所需的三角形输出到最终的网格数据结构中
依赖关系
~8-15MB
~207K SLoC