15 个版本 (9 个重大更新)
0.10.0 | 2023年9月25日 |
---|---|
0.9.3 | 2023年5月30日 |
0.9.1 | 2023年4月19日 |
0.8.0 | 2021年9月17日 |
0.1.2 | 2020年9月3日 |
#13 in 科学
1MB
15K SLoC
使用Rust编写的CLI,用于从SPH模拟的粒子数据中重建表面。有关CLI使用的库,请参阅splashsurf_lib
crate。
splashsurf
是一个从SPH粒子数据重建表面网格的工具。第一张图片显示了来自SPlisHSPlasH的SPH流体模拟粒子集的可视化。粒子半径为 0.025
。由于流体的渲染不应该看起来像一个球池,因此需要从这些粒子数据重建表面网格。下一张图片显示了由 splashsurf
生成的流体重建表面网格,其“平滑长度”为粒子半径的 2.2
倍,并且单元格大小为粒子半径的 1.1
倍。第三张图片显示了具有单元格大小为粒子半径 0.45
倍的更精细重建。这些表面网格可以输入到如Blender的3D渲染软件中,以生成美丽的动画。结果可能看起来像这样
注意:此动画未显示工具最近添加的平滑功能,更多最新渲染请参阅此视频。
目录
splashsurf
CLI 命令行工具
以下部分主要关注 splashsurf
的 CLI。有关库的更多信息,请参阅 splashsurf_lib
子文件夹中的相应 readme 或在 crates.io 上的 splashsurf_lib
crate。
简介
这是一个用于运行基于快速遍历立方体(如 SPlisHSPlasH 中执行)的 SPH 流体模拟表面重建的 CLI 工具。该工具的输出是流体的重建三角表面网格。目前,它支持使用 SPH 梯度在表面上计算法线,并将标量和矢量粒子属性插值到表面上。为了消除 SPH 模拟中典型的峰值,它支持以下详细说明的加权拉普拉斯平滑方法。作为输入,它支持从 .vtk
/.vtu
、.bgeo
、.ply
、.json
和二进制 .xyz
(即包含粒子位置数组二进制转储的文件)文件中读取粒子位置。执行重建所需的参数是原始 SPH 模拟中使用的核半径和粒子半径(用于计算粒子体积)以及遍历立方体的分辨率(已预配置默认等值面阈值)。
域分解
一个天真密集的遍历立方体重建,在整个流体域上分配完整的 3D 数组,对于较大的模拟很快变得不可行。相反,可以使用全局哈希表,其中仅分配包含非零流体密度值的立方体。如果完全禁用域分解,则此方法在 splashsurf
中使用。然而,全局哈希表方法不会导致良好的缓存局部性,并且不适合并行化(即使是像 dashmap
这样的专用并行映射实现也有性能限制)。为了改进这种情况,splashsurf
当前实现了两种域分解方法。
基于八叉树的分解
如果未指定其他选项,则基于八叉树的分解目前是默认方法,但可能会被以下描述的基于网格的方法所取代。对于基于八叉树的分解,将为所有粒子构建一个八叉树,叶节点中粒子的目标数量自动确定。对于每个叶节点,使用类似于上面概述的哈希表。由于每个哈希表较小,缓存局部性得到改善,并且由于分解,每个线程都可以在自己的本地哈希表上工作。最后,通过遍历八叉树向上拼接所有表面补丁,从而得到一个封闭表面。
此方法的缺点是,从根节点开始构建八叉树并朝根节点拼接限制了某些阶段的并行性。
基于子域网格的分解
自0.10.0版本起,splashsurf
实现了一种名为“子域网格”的新领域分解方法,可通过--subdomain-grid=on
标志进行切换。在这里,目标是按照固定数量的游程立方体单元格将流体领域划分为子域,默认为64x64x64
立方体。对于每个子域,为游程立方体单元格分配一个密集的3D数组。当然,只有包含流体粒子的子域才会实际分配。对于只包含非常少量流体粒子(小于最大子域的5%)的子域,则使用哈希表来避免浪费过多的存储空间。然而,由于大多数领域是密集的,因此每个子域的游程立方体三角剖分非常快,因为它可以充分利用缓存局部性和整个过程的并行化。对于缝合,我们确保在子域边界处执行相同的浮点运算顺序(这可以在不同步的情况下确保)。如果子域边界的场值从两侧都是相同的,那么游程立方体三角剖分将是拓扑兼容的,可以在并行化的后处理步骤中合并。总的来说,这种方法几乎总是比之前的基于八叉树的方案快。
注意
对于少量的流体粒子(即在数千以下)的情况下,由于基于任务的并行性和领域分解和缝合的额外开销,领域分解实现可能会表现出较差的性能。在这种情况下,您可以尝试禁用领域分解。然后,重建将使用全局方法,该方法使用线程局部哈希表进行并行化。对于更多的粒子,分解方法预计始终更快。
由于使用了哈希表和(如果启用)多线程,因此此实现的输出不是确定的。
如下所示,该工具可以处理大型模拟的输出。然而,它没有经过广泛的参数测试,可能无法完全抵御边缘情况或极端参数。如果您遇到问题,请与您的输入数据一起报告。
安装
命令行工具可以从此存储库构建,也可以在crates.io上获得。如果您已安装了Rust工具链,则可以使用以下命令安装splashsurf
:
cargo install splashsurf
用法
推荐设置
表面重建的良好设置取决于原始模拟,并且可能受不同模拟器不同惯例的影响。以下设置似乎与SPlisHSPlasH配合良好。
particle-radius
:应略大于实际模拟中使用的粒子半径。原始SPH粒子半径1.4到1.6倍的范围似乎合适。smoothing-length
:应设置在约1.2
。较大的值可以更平滑地平滑等值面,但也会人为地增加流体体积。surface-threshold
:一个良好的值取决于所选的particle-radius
和smoothing-length,并且可以用来对抗由于粒子半径较大而引起的流体体积增加。与其他推荐值结合,似乎
0.6
的阈值效果良好。cube-size
通常不应选择大于1.0
,以避免出现伪影(例如单个粒子衰减为菱形),建议从0.75
到0.5
的范围内开始,如果结果过于粗糙或重建过程耗时过长,可以增加或减少值。
加权表面平滑
命令行界面实现了论文"基于粒子的流体表面重建的加权拉普拉斯平滑"(Löschner, Böttcher, Jeske, Bender; 2023),该论文提出了一种快速平滑方法,以避免典型的不规则表面,同时防止简单平滑方法通常会导致的体积损失。以下图片显示了典型表面重建的渲染(右侧),由于粒子可见的凹凸与应用加权平滑后的相同表面重建(左侧)进行了比较。
您可以在此视频中看到这种渲染的动态效果。要应用这种平滑,我们建议以下设置
--mesh-smoothing-weights=on
:这将在平滑过程中启用使用特殊权重,以保留流体细节。有关更多信息,请参阅论文。--mesh-smoothing-iters=25
:这启用了输出网格的平滑。单独的迭代相对较快,25次迭代似乎在初始凹凸表面和潜在的过度平滑之间取得了良好的平衡。--mesh-cleanup=on
/--decimate-barnacles=on
:在应用平滑时,应使用其中一个选项,否则表面可能会出现伪影(更多详细信息请参阅论文)。mesh-cleanup
标志启用了一般用途的marching cubes网格清理过程,该过程在网格上的所有地方删除小的细条三角形。decimate-barnacles
启用了一种更针对性的减少,仅删除对平滑有问题的特定三角形配置。前者方法产生的网格总体上“更漂亮”,但可能比后者慢。--normals-smoothing-iters=10
:如果导出法线(使用--normals=on
),这将使渲染时外观更加平滑。
对于与加权平滑结合的重建参数,我们建议选择接近模拟参数的参数。这意味着选择与模拟中相同的粒子半径,相应的平滑长度(例如,对于SPlisHSPlasH,值为2.0
),表面阈值在0.6
和0.7
之间,以及通常在0.5
和1.0
之间的立方体大小。
工具的完整调用可能如下所示
splashsurf reconstruct particles.vtk -r=0.025 -l=2.0 -c=0.5 -t=0.6 --subdomain-grid=on --mesh-cleanup=on --mesh-smoothing-weights=on --mesh-smoothing-iters=25 --normals=on --normals-smoothing-iters=10
基准示例
例如
splashsurf reconstruct canyon_13353401_particles.xyz -r=0.011 -c=1.5 -l=2.0 -t=0.6 --subdomain-grid=on
使用这些参数,在Ryzen 9 5950X上,一个包含13353401个粒子的场景在不到3秒内重建完成。输出是一个具有6069576个三角形的网格。
[23:44:58.432][INFO] splashsurf v0.10.0 (splashsurf)
[23:44:58.432][INFO] Called with command line: splashsurf reconstruct canyon_13353401_particles.xyz -r=0.011 -c=1.5 -l=2.0 -t=0.6 --subdomain-grid=on
[23:44:58.432][INFO] Using single precision (f32) for surface reconstruction.
[23:44:58.432][INFO] Reading particle dataset from "canyon_13353401_particles.xyz"...
[23:44:58.515][INFO] Successfully read dataset with 13353401 particle positions.
[23:44:58.520][INFO] Minimal enclosing bounding box of particles was computed as: AxisAlignedBoundingBox { min: [-25.0060978, -5.0146289, -40.0634613], max: [24.4994926, 18.3062096, 39.7757950] }
[23:44:58.520][INFO] The ghost margin volume is 42.38% of the subdomain volume
[23:44:58.520][INFO] The ghost margin is 3.03 MC cells or 0.05 subdomains thick
[23:44:58.520][INFO] Number of subdomains: 82156 (47x23x76)
[23:44:58.520][INFO] Number of MC cells per subdomain: 262144 (64x64x64)
[23:44:58.520][INFO] Number of MC cells globally: 21536702464 (3008x1472x4864)
[23:44:58.520][INFO] Starting classification of particles into subdomains.
[23:44:58.601][INFO] Starting computation of global density vector.
[23:44:59.548][INFO] Largest subdomain has 167861 particles.
[23:44:59.548][INFO] Subdomains with 3358 or less particles will be considered sparse.
[23:44:59.548][INFO] Starting reconstruction (level-set evaluation and local triangulation).
[23:45:00.876][INFO] Starting stitching of subdomains to global mesh.
[23:45:00.946][INFO] Global mesh has 3038116 vertices and 6069576 triangles.
[23:45:00.996][INFO] Writing surface mesh to "canyon_surface.vtk"...
[23:45:00.996][INFO] Writing mesh with 3038116 vertices and 6069576 cells to "canyon_surface.vtk"...
[23:45:01.175][INFO] Successfully wrote mesh to file.
[23:45:01.175][INFO] Done.
[23:45:01.188][INFO] Successfully finished processing all inputs.
[23:45:01.188][INFO] Timings:
[23:45:01.188][INFO] reconstruct subcommand: 100.00%, 2756.58ms avg, 1 call (total: 2.757s)
[23:45:01.188][INFO] surface reconstruction: 100.00%, 2756.54ms avg, 1 call (total: 2.757s)
[23:45:01.188][INFO] loading particle positions: 3.00%, 82.68ms avg, 1 call (total: 0.083s)
[23:45:01.188][INFO] compute minimum enclosing aabb: 0.21%, 5.91ms avg, 1 call (total: 0.006s)
[23:45:01.188][INFO] surface reconstruction subdomain-grid: 88.17%, 2430.35ms avg, 1 call (total: 2.430s)
[23:45:01.188][INFO] decomposition: 3.29%, 80.06ms avg, 1 call (total: 0.080s)
[23:45:01.188][INFO] classifying particles: 21.22%, 16.99ms avg, 1 call (total: 0.017s)
[23:45:01.188][INFO] merging TL per cell particle counters: 0.18%, 0.14ms avg, 1 call (total: 0.000s)
[23:45:01.188][INFO] initializing flat subdomain data and index mapping: 0.08%, 0.06ms avg, 1 call (total: 0.000s)
[23:45:01.188][INFO] copying particles to subdomains: 64.65%, 51.76ms avg, 1 call (total: 0.052s)
[23:45:01.188][INFO] sort subdomain particles: 13.74%, 11.00ms avg, 1 call (total: 0.011s)
[23:45:01.188][INFO] compute_global_density_vector: 39.00%, 947.82ms avg, 1 call (total: 0.948s)
[23:45:01.188][INFO] subdomain density computation: ≈100.00%, 20.58ms avg, 1275 calls (total: 26.235s)
[23:45:01.188][INFO] collect subdomain data: 0.67%, 0.14ms avg, 1275 calls (total: 0.175s)
[23:45:01.188][INFO] initialize particle filter: 0.27%, 0.06ms avg, 1275 calls (total: 0.072s)
[23:45:01.188][INFO] neighborhood_search_spatial_hashing_flat_filtered: 88.48%, 18.21ms avg, 1275 calls (total: 23.214s)
[23:45:01.188][INFO] sequential_generate_cell_to_particle_map: 4.07%, 0.74ms avg, 1275 calls (total: 0.946s)
[23:45:01.188][INFO] write particle neighbors: 95.09%, 17.31ms avg, 1275 calls (total: 22.074s)
[23:45:01.188][INFO] sequential_compute_particle_densities_filtered: 10.30%, 2.12ms avg, 1275 calls (total: 2.702s)
[23:45:01.188][INFO] update global density values: 0.26%, 0.05ms avg, 1275 calls (total: 0.068s)
[23:45:01.188][INFO] reconstruction: 54.63%, 1327.61ms avg, 1 call (total: 1.328s)
[23:45:01.188][INFO] subdomain reconstruction (sparse): ≈1.95%, 0.85ms avg, 899 calls (total: 0.768s)
[23:45:01.188][INFO] density grid loop: 65.87%, 0.56ms avg, 899 calls (total: 0.506s)
[23:45:01.188][INFO] mc triangulation loop: 25.02%, 0.21ms avg, 899 calls (total: 0.192s)
[23:45:01.188][INFO] subdomain reconstruction (dense): ≈98.05%, 102.70ms avg, 376 calls (total: 38.617s)
[23:45:01.188][INFO] density grid loop: 94.47%, 97.03ms avg, 376 calls (total: 36.482s)
[23:45:01.188][INFO] mc triangulation loop: 5.19%, 5.33ms avg, 376 calls (total: 2.005s)
[23:45:01.188][INFO] stitching: 2.84%, 69.04ms avg, 1 call (total: 0.069s)
[23:45:01.188][INFO] surface patch offset scan: 0.01%, 0.01ms avg, 1 call (total: 0.000s)
[23:45:01.188][INFO] copy interior verts/tris and deduplicate exterior verts: 83.51%, 57.65ms avg, 1 call (total: 0.058s)
[23:45:01.188][INFO] write surface mesh to file: 6.50%, 179.17ms avg, 1 call (total: 0.179s)
[23:45:01.188][INFO] writing mesh: 99.98%, 179.14ms avg, 1 call (total: 0.179s)
文件序列
您可以选择处理单个文件,或者让工具自动处理一系列文件。通过在文件名中指定一个包含 {}
占位符模式的文件名来表示一系列文件。该工具会将占位符视为一个 (\d+)
正则表达式,即至少匹配一个数字的组。这允许进行任意零填充以及非零填充的递增索引。然后,所有与该模式匹配的输入路径中的文件都将按自然排序顺序(即静默跳过序列中缺失的文件)进行处理。请注意,工具在命令调用时立即收集所有现有文件名,并且在运行时不会更新该列表。可以使用 -s
/--start-index
和/或 -e
/--end-index
参数来指定应处理的序列的第一个和最后一个文件。
通过指定标志 --mt-files=on
,可以并行处理多个文件。如果启用此功能,还应设置 --mt-particles=off
,因为同时启用两者可能会降低性能。如果需要处理许多只有少数粒子的文件,则 --mt-files=on
和 --mt-particles=off
的组合可能会更快。
可以使用 --num-threads
/-n
参数或 RAYON_NUM_THREADS
环境变量来影响线程数。
注意: 目前,一些函数没有顺序实现,并且始终在粒子或网格/域上并行化。这包括
- 新的“子域网格”域分解方法,作为先前基于八叉树方法的替代方案
- 一些后处理功能(插值平滑权重,插值法线和其他流体属性)
使用 --mt-particles=off
参数不会影响这些表面重建的部分。因此,建议在此功能使用时不要跨多个文件并行化。
输入文件格式
VTK
使用 vtkio
加载具有 ".vtk
" 扩展名的旧版 VTK 文件。VTK 文件以大端二进制文件加载,并必须包含具有 f32
或 f64
顶点坐标的“无结构网格”。除了使用 --interpolate-attributes
命令行参数指定的属性外,忽略任何其他数据或属性。目前支持的属性数据类型是标量整数、浮点数和三分量浮点向量。只加载第一个“无结构网格”,忽略其他实体。
请注意,目前仅支持在 这里 文档中描述的“纯”v4.2旧版格式。这对应于 meshio convert
工具的 --output-format vtk42
标志。
VTU
使用 vtkio
加载具有 ".vtu
" 扩展名的 VTK XML 文件。目前仅支持使用 ASCII 或编码二进制编写的 VTU 文件。不支持使用“原始”二进制部分(即一个 <AppendedData encoding="raw">...</AppendedData>
块)的文件。
BGEO
带有 ".bgeo
" 扩展名的文件使用自定义解析器加载。请注意,仅支持“旧”的 BGEOV
格式(这是由“Partio”支持的格式)。支持未压缩和(gzip)压缩文件。仅从文件中加载点和它们的隐式位置矢量属性。所有其他实体(例如顶点)和其他属性都将忽略/丢弃。值得注意的是,解析器支持由 SPlisHSPlasH (“Partio 导出”)编写的 BGEO 文件。
PLY
带有 ".ply
" 扩展名的文件使用 ply-rs
加载。PLY 文件必须包含一个名为 "vertex
" 的元素,具有类型为 f32
/"Property::Float
" 的属性 x
、y
和 z
。任何其他属性或元素都将被忽略。
XYZ
带有 ".xyz
" 扩展名的文件被解释为系统本地字节序中的 f32
值的原始字节。三个连续的 f32
表示一个流体粒子的 (x,y,z) 坐标三元组。
JSON
带有 ".json
" 扩展名的文件被解释为 Vec<[f32; 3]>
的序列化,其中每个三组件数组表示一个粒子的位置。这对应于例如具有以下结构的 JSON 文件
[
[1.0, 2.0, 3.0],
[1.0, 2.0, 3.0],
]
输出文件格式
目前,仅支持 VTK 和 OBJ 格式来存储重建的表面网格。这两种格式都支持法向量的输出,但只有 VTK 支持额外的字段,例如插值标量或矢量场。文件格式由输出文件名的扩展名推断。
所有命令行选项
reconstruct
命令
splashsurf-reconstruct (v0.10.0) - Reconstruct a surface from particle data
Usage: splashsurf reconstruct [OPTIONS] --particle-radius <PARTICLE_RADIUS> --smoothing-length <SMOOTHING_LENGTH> --cube-size <CUBE_SIZE> <INPUT_FILE_OR_SEQUENCE>
Options:
-q, --quiet Enable quiet mode (no output except for severe panic messages), overrides verbosity level
-v... Print more verbose output, use multiple "v"s for even more verbose output (-v, -vv)
-h, --help Print help
-V, --version Print version
Input/output:
-o, --output-file <OUTPUT_FILE> Filename for writing the reconstructed surface to disk (supported formats: VTK, PLY, OBJ, default: "{original_filename}_surface.vtk")
--output-dir <OUTPUT_DIR> Optional base directory for all output files (default: current working directory)
-s, --start-index <START_INDEX> Index of the first input file to process when processing a sequence of files (default: lowest index of the sequence)
-e, --end-index <END_INDEX> Index of the last input file to process when processing a sequence of files (default: highest index of the sequence)
<INPUT_FILE_OR_SEQUENCE> Path to the input file where the particle positions are stored (supported formats: VTK 4.2, VTU, binary f32 XYZ, PLY, BGEO), use "{}" in the filename to indicate a placeholder for a sequence
Numerical reconstruction parameters:
-r, --particle-radius <PARTICLE_RADIUS>
The particle radius of the input data
--rest-density <REST_DENSITY>
The rest density of the fluid [default: 1000.0]
-l, --smoothing-length <SMOOTHING_LENGTH>
The smoothing length radius used for the SPH kernel, the kernel compact support radius will be twice the smoothing length (in multiplies of the particle radius)
-c, --cube-size <CUBE_SIZE>
The cube edge length used for marching cubes in multiplies of the particle radius, corresponds to the cell size of the implicit background grid
-t, --surface-threshold <SURFACE_THRESHOLD>
The iso-surface threshold for the density, i.e. the normalized value of the reconstructed density level that indicates the fluid surface (in multiplies of the rest density) [default: 0.6]
--particle-aabb-min <X_MIN> <Y_MIN> <Z_MIN>
Lower corner of the domain where surface reconstruction should be performed (requires domain-max to be specified)
--particle-aabb-max <X_MIN> <Y_MIN> <Z_MIN>
Upper corner of the domain where surface reconstruction should be performed (requires domain-min to be specified)
Advanced parameters:
-d, --double-precision=<off|on> Enable the use of double precision for all computations [default: off] [possible values: off, on]
--mt-files=<off|on> Enable multi-threading to process multiple input files in parallel (NOTE: Currently, the subdomain-grid domain decomposition approach and some post-processing functions including interpolation do not have sequential versions and therefore do not work well with this option enabled) [default: off] [possible values: off, on]
--mt-particles=<off|on> Enable multi-threading for a single input file by processing chunks of particles in parallel [default: on] [possible values: off, on]
-n, --num-threads <NUM_THREADS> Set the number of threads for the worker thread pool
Domain decomposition (octree or grid) parameters:
--subdomain-grid=<off|on>
Enable spatial decomposition using a regular grid-based approach [default: off] [possible values: off, on]
--subdomain-cubes <SUBDOMAIN_CUBES>
Each subdomain will be a cube consisting of this number of MC cube cells along each coordinate axis [default: 64]
--octree-decomposition=<off|on>
Enable spatial decomposition using an octree (faster) instead of a global approach [default: on] [possible values: off, on]
--octree-stitch-subdomains=<off|on>
Enable stitching of the disconnected local meshes resulting from the reconstruction when spatial decomposition is enabled (slower, but without stitching meshes will not be closed) [default: on] [possible values: off, on]
--octree-max-particles <OCTREE_MAX_PARTICLES>
The maximum number of particles for leaf nodes of the octree, default is to compute it based on the number of threads and particles
--octree-ghost-margin-factor <OCTREE_GHOST_MARGIN_FACTOR>
Safety factor applied to the kernel compact support radius when it's used as a margin to collect ghost particles in the leaf nodes when performing the spatial decomposition
--octree-global-density=<off|on>
Enable computing particle densities in a global step before domain decomposition (slower) [default: off] [possible values: off, on]
--octree-sync-local-density=<off|on>
Enable computing particle densities per subdomain but synchronize densities for ghost-particles (faster, recommended). Note: if both this and global particle density computation is disabled the ghost particle margin has to be increased to at least 2.0 to compute correct density values for ghost particles [default: on] [possible values: off, on]
Interpolation & normals:
--normals=<off|on>
Enable omputing surface normals at the mesh vertices and write them to the output file [default: off] [possible values: off, on]
--sph-normals=<off|on>
Enable computing the normals using SPH interpolation instead of using the area weighted triangle normals [default: off] [possible values: off, on]
--normals-smoothing-iters <NORMALS_SMOOTHING_ITERS>
Number of smoothing iterations to run on the normal field if normal interpolation is enabled (disabled by default)
--output-raw-normals=<off|on>
Enable writing raw normals without smoothing to the output mesh if normal smoothing is enabled [default: off] [possible values: off, on]
--interpolate-attributes <INTERPOLATE_ATTRIBUTES>
List of point attribute field names from the input file that should be interpolated to the reconstructed surface. Currently this is only supported for VTK and VTU input files
Postprocessing:
--mesh-cleanup=<off|on>
Enable MC specific mesh decimation/simplification which removes bad quality triangles typically generated by MC [default: off] [possible values: off, on]
--decimate-barnacles=<off|on>
Enable decimation of some typical bad marching cubes triangle configurations (resulting in "barnacles" after Laplacian smoothing) [default: off] [possible values: off, on]
--keep-verts=<off|on>
Enable keeping vertices without connectivity during decimation instead of filtering them out (faster and helps with debugging) [default: off] [possible values: off, on]
--mesh-smoothing-iters <MESH_SMOOTHING_ITERS>
Number of smoothing iterations to run on the reconstructed mesh
--mesh-smoothing-weights=<off|on>
Enable feature weights for mesh smoothing if mesh smoothing enabled. Preserves isolated particles even under strong smoothing [default: off] [possible values: off, on]
--mesh-smoothing-weights-normalization <MESH_SMOOTHING_WEIGHTS_NORMALIZATION>
Normalization value from weighted number of neighbors to mesh smoothing weights [default: 13.0]
--output-smoothing-weights=<off|on>
Enable writing the smoothing weights as a vertex attribute to the output mesh file [default: off] [possible values: off, on]
--generate-quads=<off|on>
Enable trying to convert triangles to quads if they meet quality criteria [default: off] [possible values: off, on]
--quad-max-edge-diag-ratio <QUAD_MAX_EDGE_DIAG_RATIO>
Maximum allowed ratio of quad edge lengths to its diagonals to merge two triangles to a quad (inverse is used for minimum) [default: 1.75]
--quad-max-normal-angle <QUAD_MAX_NORMAL_ANGLE>
Maximum allowed angle (in degrees) between triangle normals to merge them to a quad [default: 10]
--quad-max-interior-angle <QUAD_MAX_INTERIOR_ANGLE>
Maximum allowed vertex interior angle (in degrees) inside of a quad to merge two triangles to a quad [default: 135]
--mesh-aabb-min <X_MIN> <Y_MIN> <Z_MIN>
Lower corner of the bounding-box for the surface mesh, triangles completely outside are removed (requires mesh-aabb-max to be specified)
--mesh-aabb-max <X_MIN> <Y_MIN> <Z_MIN>
Upper corner of the bounding-box for the surface mesh, triangles completely outside are removed (requires mesh-aabb-min to be specified)
--mesh-aabb-clamp-verts=<off|on>
Enable clamping of vertices outside of the specified mesh AABB to the AABB (only has an effect if mesh-aabb-min/max are specified) [default: off] [possible values: off, on]
--output-raw-mesh=<off|on>
Enable writing the raw reconstructed mesh before applying any post-processing steps [default: off] [possible values: off, on]
Debug options:
--output-dm-points <OUTPUT_DM_POINTS>
Optional filename for writing the point cloud representation of the intermediate density map to disk
--output-dm-grid <OUTPUT_DM_GRID>
Optional filename for writing the grid representation of the intermediate density map to disk
--output-octree <OUTPUT_OCTREE>
Optional filename for writing the octree used to partition the particles to disk
--check-mesh=<off|on>
Enable checking the final mesh for holes and non-manifold edges and vertices [default: off] [possible values: off, on]
--check-mesh-closed=<off|on>
Enable checking the final mesh for holes [default: off] [possible values: off, on]
--check-mesh-manifold=<off|on>
Enable checking the final mesh for non-manifold edges and vertices [default: off] [possible values: off, on]
--check-mesh-debug=<off|on>
Enable debug output for the check-mesh operations (has no effect if no other check-mesh option is enabled) [default: off] [possible values: off, on]
convert
子命令
允许在粒子文件格式之间以及网格文件格式之间进行转换。对于粒子,支持 VTK, BGEO, PLY, XYZ, JSON -> VTK
的转换。对于网格,仅支持 VTK, PLY -> VTK, OBJ
。
splashsurf-convert (v0.9.0) - Convert particle or mesh files between different file formats
Usage: splashsurf.exe convert [OPTIONS] -o <OUTPUT_FILE>
Options:
--particles <INPUT_PARTICLES>
Path to the input file with particles to read (supported formats: .vtk, .vtu, .bgeo, .ply, .xyz, .json)
--mesh <INPUT_MESH>
Path to the input file with a surface to read (supported formats: .vtk, .ply)
-o <OUTPUT_FILE>
Path to the output file (supported formats for particles: .vtk, .bgeo, .json, for meshes: .obj, .vtk)
--overwrite
Whether to overwrite existing files without asking
--domain-min <X_MIN> <Y_MIN> <Z_MIN>
Lower corner of the domain of particles to keep (requires domain-max to be specified)
--domain-max <X_MIN> <Y_MIN> <Z_MIN>
Lower corner of the domain of particles to keep (requires domain-min to be specified)
-h, --help
Print help
-V, --version
Print version
许可证
有关此项目的许可信息,请参阅 LICENSE 文件。splashsurf 徽标基于 SVG Repo 上发布的两个图形(1、2),在 CC0(“无保留权利”)许可下发布。此页面上显示的龙模型是 "Stanford 3D Scanning Repository" 的一部分。
依赖项
~17–28MB
~400K SLoC