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 |
核心架构
使用 两层体素模式:
- Procedural layer — 由地形查找函数确定(无限大,缓存已生成的 Chunk)
- 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 shadermultiple_worlds— 多个体素世界lod— 多级细节度
选型建议
适用:快速原型验证、Minecraft-风格体素地形、需要多世界的场景。
不适用:需要完全自定义网格化算法、特殊网络同步协议、与 Bevy Meshlet 管线深度集成的场景 → 考虑 block-mesh + 自研 Chunk 系统。
相关页面
- voxel-rendering — 体素渲染技术总览
- greedy-meshing — 贪心网格化算法详解
- block-mesh — Rust 体素网格化底层库
- bevy — Bevy 引擎总览
- bevy-rendering — Bevy 渲染系统
- arpg-terrain-design — ARPG 地形设计(含体素地形章节)