#mesh #voxel #isosurface #graphics #distance-field

fast-surface-nets

在规则网格上快速实现Naive Surface Nets

2个不稳定版本

0.2.0 2022年4月18日
0.1.0 2021年9月28日

#470图形API


toxicblend 中使用

MIT/Apache

20KB
282

fast-surface-nets

在规则网格上快速实现Naive Surface Nets。

Mesh Examples

Surface Nets是从规则网格上采样的符号距离场中提取等值面网格的算法。它几乎与双轮廓线相同,但不是使用Hermite(导数)数据来估计表面点,而是Surface Nets将对等值面穿过体素立方体边界的点进行更简单的插值(平均)。

基准测试显示,surface_nets 在2.5 GHz Intel Core i7的单核上每秒生成约2000万个三角形。该实现通过使用小查找表和glam提供的SIMD加速来执行3D浮点向量数学,从而实现了高性能。(用户不需要在任何API签名中使用glam类型。)要自行运行基准测试,请执行以下命令:cd bench/ && cargo bench

通过以下方式估计高质量的表面法线:

  1. 使用中心差分计算SDF导数
  2. 沿体素立方体边界的SDF导数进行双线性插值

当处理稀疏数据集时,surface_nets 可以生成适合拼接的数组块网格。这是因为不会在块的正边界上生成面。只需将网格平移到给定块的正确世界坐标即可。

示例代码

use fast_surface_nets::ndshape::{ConstShape, ConstShape3u32};
use fast_surface_nets::{surface_nets, SurfaceNetsBuffer};

// A 16^3 chunk with 1-voxel boundary padding.
type ChunkShape = ConstShape3u32<18, 18, 18>;

// This chunk will cover just a single octant of a sphere SDF (radius 15).
let mut sdf = [1.0; ChunkShape::USIZE];
for i in 0u32..ChunkShape::SIZE {
    let [x, y, z] = ChunkShape::delinearize(i);
    sdf[i as usize] = ((x * x + y * y + z * z) as f32).sqrt() - 15.0;
}

let mut buffer = SurfaceNetsBuffer::default();
surface_nets(&sdf, &ChunkShape {}, [0; 3], [17; 3], &mut buffer);

// Some triangles were generated.
assert!(!buffer.indices.is_empty());

许可:MIT OR Apache-2.0

依赖项

~3MB
~90K SLoC