bevy_voxel_world

bevy_voxel_world 是一个 Bevy 插件,用于生成和修改体素地形,处理多线程网格化、Chunk 生成/销毁、纹理映射和友好的 API。

基本信息

属性
仓库splashdust/bevy_voxel_world
星标308★ / 42 分叉 / 420 提交 / 28 发布
语言Rust 96.8%, WGSL 3.2%
许可MIT + Apache-2.0

核心架构

使用 两层体素模式

  1. Procedural layer — 由地形查找函数确定(无限大,缓存已生成的 Chunk)
  2. Persistent layer — 存储于 HashMap,通过 set_voxel / get_voxel 操作

Persistent layer 永远覆盖 Procedural layer,让世界既无限大又只需存储被有意修改的体素。

配置与用法

#[derive(Resource, Clone, Default)]
struct MyWorld;
 
impl VoxelWorldConfig for MyWorld {
    type MaterialIndex = u8;
    type ChunkUserBundle = ();
    fn spawning_distance(&self) -> u32 { 25 }
}
 
// 注册插件
app.add_plugins(VoxelWorldPlugin::with_config(MyWorld));
 
// 读写体素
fn my_system(mut voxel_world: VoxelWorld<MyWorld>) {
    voxel_world.set_voxel(IVec3 { ... }, WorldVoxel::Solid(0));
}

关键特性

特性说明
多线程网格化Bevy Task Pool 中执行 greedy meshing
Chunk 管理根据相机距离自动生成/销毁
LOD通过 chunk_lod 回调实现每 Chunk 多级细节
纹理数组支持 W × (W × n) 图集格式
自定义 Shader可替换默认材质系统
射线检测内置 raycast 用于鼠标拣取世界坐标
自定义网格化可替换默认 meshing 委托

多世界支持

配置结构体的类型充当世界实例标识符。通过添加多个插件实例可创建多个体素世界,每个有独立配置。

实用代码示例

纹理映射

fn texture_index_mapper(&self) -> Arc<dyn Fn(u8) -> [u32; 3] + Send + Sync> {
    Arc::new(|vox_mat: u8| match vox_mat {
        SNOWY_BRICK => [0, 1, 2],
        FULL_BRICK => [2, 2, 2],
        GRASS | _ => [3, 3, 3],
    })
}

射线检测

if let Some(result) = voxel_world.raycast(ray, &|(_pos, _vox)| true) {
    // result.position = 命中体素的世界坐标
    // result.normal = 表面法线;空邻格 = result.position + result.normal
}

关键示例

  • noise_terrain — 程序化地形
  • textures — 纹理映射
  • ray_cast — 鼠标拣取
  • custom_meshing — 自定义网格生成
  • custom_material — 自定义 WGSL shader
  • multiple_worlds — 多个体素世界
  • lod — 多级细节度

选型建议

适用:快速原型验证、Minecraft-风格体素地形、需要多世界的场景。

不适用:需要完全自定义网格化算法、特殊网络同步协议、与 Bevy Meshlet 管线深度集成的场景 → 考虑 block-mesh + 自研 Chunk 系统。

相关页面