13 个版本
0.3.3 | 2024 年 7 月 7 日 |
---|---|
0.3.2 | 2024 年 5 月 16 日 |
0.2.7 | 2024 年 2 月 25 日 |
0.1.6 | 2023 年 7 月 18 日 |
0.1.1 | 2023 年 3 月 12 日 |
#181 in 数据结构
860 个月下载量
用于 hammerspace
605KB
13K SLoC
纯 Rust 几何处理库
特性
- 隐式/体素/体积建模
- 体素重新网格化
- 布尔运算
- 偏移
- 显式建模
- 网格简化(降维)
- 各向同性重新网格化
IO
从/到 STL 文件读取/写入网格
您可以使用 StlReader
和 StlWriter
结构读取/写入 STL 文件。仅支持二进制 STL。
示例
use std::path::Path;
use baby_shark::{
io::stl::{StlReader, StlWriter},
mesh::corner_table::prelude::CornerTableF
};
fn main() {
let mut reader = StlReader::new();
let mesh: CornerTableF = reader.read_stl_from_file(Path::new("./read.stl"))
.expect("Read mesh from STL file");
let writer = StlWriter::new();
writer.write_stl_to_file(&mesh, Path::new("./write.stl"))
.expect("Save mesh to STL file");
}
隐式建模
布尔运算
布尔运算是一组可以对体积执行的操作,用于组合或修改其形状。本库支持的布尔运算包括
- 并集 - 将两个体积合并成一个体积,结果是一个包含两个模型组合体积的形状。
- 减去 - 从另一个体积中移除体积,结果是一个形状,它是两个模型之间的差。
- 交集 - 返回两个模型共有的体积,结果是一个形状,它只包含重叠区域。
这些布尔运算在各种应用中很有用,例如通过组合简单形状来创建复杂形状,从体积中移除不需要的部分,或找到两个体积之间的交集。
示例
减去 | 并集 |
---|---|
体积偏移
体积偏移允许对模型形状进行扩展或收缩,适用于各种应用,如数控加工、碰撞检测和快速原型制作。它是模型生成和路径创建的重要工具。支持向内和向外偏移。
示例
体素重新网格化
体素重新网格化 是一种用于计算机图形学的计算过程,用于重建或优化三维(3D)模型的拓扑结构。体素是构成 3D 空间的体积像素,重新网格化涉及重新组织这些体素以创建更均匀、更明确的网格结构。此外,它还具有删除重叠几何体的好处,这在雕刻应用中非常有价值。
示例
显式建模
各向同性重新网格化
此算法逐步执行简单的操作,如边分割、边折叠、边翻转和拉普拉斯平滑。所有重新网格化补丁的顶点都被重新投影到原始表面,以保持输入的良好近似。可以通过适当的方法关闭任何这些操作(with_<operation>(false)
)。
示例
let remesher = IncrementalRemesher::new()
.with_iterations_count(10)
.with_split_edges(true)
.with_collapse_edges(true)
.with_flip_edges(true)
.with_shift_vertices(true)
.with_project_vertices(true);
remesher.remesh(&mut mesh, 0.002f32);
网格简化(降维)
此库实现了增量边细化算法。在每次迭代中,具有最低折叠成本的边将被折叠。支持多种停止条件
- 最大误差 - 当最低成本的折叠大于给定值时,算法停止
- 最小面数 - 当面数下降到给定值以下时,算法停止
- 边界球 - 基于点到距离的自适应误差算法。对于LOD网格细化很有用。
示例
let mut decimator = EdgeDecimator::new()
.decimation_criteria(ConstantErrorDecimationCriteria::new(0.0005))
.min_faces_count(Some(10000));
decimator.decimate(&mut mesh);
边界球示例
let origin = Point3::<f32>::origin();
let radii_error_map = vec![
(10.0f32, 0.0001f32),
(15.0f32, 0.05f32),
(40.0f32, 0.8f32),
];
let criteria = BoundingSphereDecimationCriteria::new(origin, radii_error_map);
let mut decimator = EdgeDecimator::new().decimation_criteria(criteria);
decimator.decimate(&mut mesh);
依赖项
~8MB
~144K SLoC