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 数据结构

Download history 109/week @ 2024-05-03 306/week @ 2024-05-10 67/week @ 2024-05-17 6/week @ 2024-05-24 6/week @ 2024-05-31 6/week @ 2024-06-07 2/week @ 2024-06-14 2/week @ 2024-06-28 128/week @ 2024-07-05 10/week @ 2024-07-12

860 个月下载量
用于 hammerspace

MIT 许可协议

605KB
13K SLoC

纯 Rust 几何处理库

Crates.io License

特性

  • 隐式/体素/体积建模
    • 体素重新网格化
    • 布尔运算
    • 偏移
  • 显式建模
    • 网格简化(降维)
    • 各向同性重新网格化

IO

从/到 STL 文件读取/写入网格

您可以使用 StlReaderStlWriter 结构读取/写入 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");
}

隐式建模

布尔运算

布尔运算是一组可以对体积执行的操作,用于组合或修改其形状。本库支持的布尔运算包括

  • 并集 - 将两个体积合并成一个体积,结果是一个包含两个模型组合体积的形状。
  • 减去 - 从另一个体积中移除体积,结果是一个形状,它是两个模型之间的差。
  • 交集 - 返回两个模型共有的体积,结果是一个形状,它只包含重叠区域。

这些布尔运算在各种应用中很有用,例如通过组合简单形状来创建复杂形状,从体积中移除不需要的部分,或找到两个体积之间的交集。

示例

减去 并集
boolean_subtract boolean_union

体积偏移

体积偏移允许对模型形状进行扩展或收缩,适用于各种应用,如数控加工、碰撞检测和快速原型制作。它是模型生成和路径创建的重要工具。支持向内和向外偏移。

示例

image

体素重新网格化

体素重新网格化 是一种用于计算机图形学的计算过程,用于重建或优化三维(3D)模型的拓扑结构。体素是构成 3D 空间的体积像素,重新网格化涉及重新组织这些体素以创建更均匀、更明确的网格结构。此外,它还具有删除重叠几何体的好处,这在雕刻应用中非常有价值。

示例

image

显式建模

各向同性重新网格化

此算法逐步执行简单的操作,如边分割、边折叠、边翻转和拉普拉斯平滑。所有重新网格化补丁的顶点都被重新投影到原始表面,以保持输入的良好近似。可以通过适当的方法关闭任何这些操作(with_<operation>(false))。

image

示例

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网格细化很有用。

image

示例

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