#voxel #data #data-channel #data-structures #2d-3d #building-block #real-time

bin+lib building-blocks

用于在 2D 和 3D 整数晶格上处理地图的数据类型、集合和算法。通常称为体素数据。

11 个版本 (6 个破坏性更新)

0.7.1 2021 年 9 月 23 日
0.7.0 2021 年 6 月 14 日
0.6.0 2021 年 3 月 21 日
0.5.0 2021 年 2 月 8 日
0.1.0 2020 年 10 月 26 日

178图形 API

Download history 9/week @ 2024-03-09 5/week @ 2024-03-16 28/week @ 2024-03-30 8/week @ 2024-04-06 4/week @ 2024-04-20 2/week @ 2024-04-27

83 每月下载量

MIT 许可证

410KB
9K SLoC

building-blocks

Crates.io Docs.rs license Crates.io Discord

Building Blocks 是一个用于实时应用的体素库。

Meshing

Wireframe

LOD Terrain

我们专注于通用数据结构和算法。功能包括

  • 2D 和 3D 数据存储
    • 每个空间维度多个数据通道的结构化数组 (SoA) 存储
    • 具有泛型块存储的 ChunkMap
    • 块缓存、压缩和序列化
    • OctreeSet 体素点的分层位集合
  • 网格生成
    • Surface Nets 等距面提取
    • 类似 Minecraft 的贪婪网格化
    • 高度图
  • 空间查询
    • 在八叉树中进行稀疏遍历和搜索
    • 使用 ncollide3d 对八叉树进行光线投射和球投射
    • Amanatides 和 Woo 光线网格遍历
    • 路径查找
  • 细节级别
    • ChunkMap 可以将块下采样到同一存储中的较低分辨率
    • 动态 3D 裁剪图,以保持焦点附近的高细节
    • 多分辨率 Surface Nets (待办事项)
  • 过程生成
    • 采样有符号距离场
    • 使用 sdfu 构造实体几何

简短代码示例

以下代码采样 有符号距离场 并从中生成网格。

use building_blocks::{
    core::sdfu::{Sphere, SDF},
    prelude::*,
    mesh::{SurfaceNetsBuffer, surface_nets},
};

let center = Point3f::fill(25.0);
let radius = 10.0;
let sphere_sdf = Sphere::new(radius).translate(center);

let extent = Extent3i::from_min_and_shape(Point3i::ZERO, Point3i::fill(50));
let mut samples = Array3x1::fill_with(extent, |p| sphere_sdf.dist(Point3f::from(p)));

let mut mesh_buffer = SurfaceNetsBuffer::default();
let voxel_size = 2.0; // length of the edge of a voxel
surface_nets(&samples, samples.extent(), voxel_size, &mut mesh_buffer);

学习

设计和架构

有一个简短的设计文档,概述了关于当前架构所做的设计决策。您可能会发现这是一份关于最重要代码的高层次总结。

文档和示例

了解这个库的最好方法是阅读文档和示例。要查看最新稳定版本的文档,请访问这里。对于最新不稳定版本的文档,请克隆存储库并运行

cargo doc --open

这里有很多带示例的文档。查看examples/目录,了解Building Blocks如何在实际应用中使用。

入门指南

这个库被组织成几个crate。其中最基本的包括

  • core:格点点和范围数据类型
  • storage:格点映射的存储,即定义在Z^2Z^3

然后您可以从其他crate中获得更多功能

  • mesh:3D网格生成算法
  • search:格点映射上的搜索算法

要了解格点映射的基本知识,请从这些文档页面开始

基准测试

要运行基准测试(使用“criterion”crate),请转到crate的根目录并运行cargo bench。截至版本0.5.0,所有基准测试结果都发布在发布说明中。

配置

LTO

强烈建议在使用building-blocks时启用链接时优化。它可以提高如网格生成等关键算法的性能,最高可达2倍。只需将以下内容添加到您的Cargo.toml文件中即可

[profile.release]
lto = true

Cargo功能

Building Blocks被组织成几个crate,其中一些crate隐藏在功能之后,一些crate本身具有功能,这些功能由顶级crate重新导出。一些功能默认启用。您可以在Cargo.toml中声明default-features = false来避免不必要的依赖。

[dependencies.building-blocks]
version = "0.6"
default-features = false
features = ["foo", "bar"]

数学类型转换

通过启用相应的功能,PointN类型可以将转换到/从glamnalgebramint类型。

压缩后端和WASM

块压缩支持两个内置后端:Lz4Snappy。它们通过启用“lz4”和“snappy”功能来启用。“lz4”是默认值,但它依赖于C++库,因此与WASM不兼容。但Snappy是纯Rust,所以它可以!只需将“snappy”添加到您的features列表中即可。

VOX文件

通过dot_voxcrate支持".VOX"文件。启用dot_vox功能以暴露通用的encode_vox函数和Array3x1::decode_vox构造函数。

图像

数组可以被转换为 ImageBuffer 并从 image 包中的 GenericImageView 构建而来。启用 image 功能可以暴露泛型的 encode_image 函数和 From<Im> where Im: GenericImageView 实现。

有符号距离场实用工具(sdfu)

sdfu 包提供了方便的 API 用于构造实体几何操作。通过启用此功能,PointN 类型将实现 sdfu::mathtypes 特性,以便与这些 API 一起使用。此外,sdfu 包也将在 building_blocks::core::sdfu 下导出。

开发

我们根据 项目板 优先考虑工作。

如果您想做出贡献,请首先阅读 设计理念贡献指南

许可证:MIT

依赖项

~2.3–7MB
~116K SLoC