2个不稳定版本
0.2.0 | 2022年4月18日 |
---|---|
0.1.0 | 2021年9月28日 |
#470 在 图形API
在 toxicblend 中使用
20KB
282 行
fast-surface-nets
在规则网格上快速实现Naive Surface Nets。
Surface Nets是从规则网格上采样的符号距离场中提取等值面网格的算法。它几乎与双轮廓线相同,但不是使用Hermite(导数)数据来估计表面点,而是Surface Nets将对等值面穿过体素立方体边界的点进行更简单的插值(平均)。
基准测试显示,surface_nets
在2.5 GHz Intel Core i7的单核上每秒生成约2000万个三角形。该实现通过使用小查找表和glam
提供的SIMD加速来执行3D浮点向量数学,从而实现了高性能。(用户不需要在任何API签名中使用glam
类型。)要自行运行基准测试,请执行以下命令:cd bench/ && cargo bench
。
通过以下方式估计高质量的表面法线:
- 使用中心差分计算SDF导数
- 沿体素立方体边界的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