Project Icon

bevy_voxel_world

Bevy引擎体素世界生成与修改插件

bevy_voxel_world是一款Bevy引擎插件,用于生成和修改体素地形。它提供多线程网格化、区块管理和纹理映射等功能。通过地形查找函数和体素操作,开发者可创建无限大的世界,仅存储经过修改的体素信息。插件支持自定义材质和光线投射,为Bevy游戏开发提供灵活的体素世界解决方案。

bevy_voxel_world

Crates.io License Bevy tracking


什么是 bevy_voxel_world

这个插件使得在Bevy中生成和修改体素地形变得简单。bevy_voxel_world 处理多线程网格生成、区块生成/销毁、纹理映射,并提供了一个可以从任何系统访问的易用API。

bvw_480

$ cargo run -r --example noise_terrain

世界可以通过两种主要方式控制:通过地形查找函数,以及直接使用 set_voxelget_voxel 函数。世界有两个"层"的体素信息,一个是由地形查找函数确定的程序化层,另一个是由 set_voxel 控制并存储在 HashMap 中的持久层。持久层始终覆盖程序化层。这样,世界可以无限大,但我们只需要存储有意更改的体素信息。在当前实现中,已生成区块的程序化层会被缓存,所以如果生成距离很大,仍可能使用大量内存。

关于如何使用地形查找函数的示例,请参见此示例

基本设置

为你的世界创建一个配置结构:

#[derive(Resource, Clone, Default)]
struct MyWorld;

impl VoxelWorldConfig for MyWorld {
    // 所有选项都有默认值,所以你只需添加你想修改的选项。
    // 完整列表请参见 src/configuration.rs
    fn spawning_distance(&self) -> u32 {
        25
    }
}

然后使用你的配置添加插件:

.add_plugins(VoxelWorldPlugin::with_config(MyWorld))

配置结构有两个作用:

访问世界

要在系统中访问体素世界实例,你可以使用 VoxelWorld 系统参数。VoxelWorld 接受一个类型参数,即你想访问的世界的配置结构。

set_voxelget_voxel 访问函数可用于操作世界中的体素数据。

fn my_system(mut voxel_world: VoxelWorld<MyWorld>) {
    voxel_world.set_voxel(IVec3 { ... }, WorldVoxel::Solid(0));
}

这将更新持久 HashMap 中给定位置的体素值,并导致 bevy_voxel_world 将受影响的区块排队重新生成网格。

体素由其在世界中的XYZ坐标(由 IVec3 指定)作为键。体素类型由 WorldVoxel 类型指定。体素可以是 UnsetAirSolid

体素材质

Solid 体素持有一个 u8 材质类型值。因此,最多支持256种材质类型。材质类型可以通过映射回调轻松映射到2D纹理数组中的索引。

可以在配置中提供自定义数组纹理。它应该是一个大小为 W x (W * n) 的图像,其中 n 是索引数。因此,4个16x16像素纹理的数组大小应为16x64像素。索引数量在第二个参数中指定。

然后,要映射哪些索引属于哪些材质类型,你可以提供一个 texture_index_mapper 回调:

impl VoxelWorldConfig for MyWorld {
    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],
        })
    }

    fn voxel_texture(&self) -> Option<(String, u32)> {
        Some(("example_voxel_texture.png".into(), 4)) // 具有4个索引的数组纹理
    }
}

texture_index_mapper 回调接收一个材质类型,应返回一个包含三个值的数组。这些值表示哪个纹理索引映射到体素的 [顶部, 侧面, 底部]

有关可运行的示例,请参见纹理示例

Screenshot 2023-11-06 at 21 50 05

自定义着色器支持

如果你需要进一步自定义材质,可以在添加插件时使用 .with_material(MyCustomVoxelMaterial) 来注册你自己的Bevy材质。这允许你在 bevy_voxel_world 中使用自定义着色器。更多详情请参见此示例

射线投射

要从屏幕上的像素位置(例如鼠标位置)找到体素世界中的体素位置,你可以向体素世界投射射线。

fn do_something_with_mouse_voxel_pos(
    voxel_world: VoxelWorld<MyWorld>,
    camera_info: Query<(&Camera, &GlobalTransform), With<VoxelWorldCamera<MyWorld>>>,
    mut cursor_evr: EventReader<CursorMoved>,
) {
    for ev in cursor_evr.read() {
        // 从光标位置获取射向世界的射线
        let (camera, cam_gtf) = camera_info.single();
        let Some(ray) = camera.viewport_to_world(cam_gtf, ev.position) else {
            return;
        };

        if let Some(result) = voxel_world.raycast(ray, &|(_pos, _vox)| true) {
            // result.position 将是体素在世界中的位置,类型为 Vec3
            // 要获取射线相交表面方向上体素旁边的空位置,可以使用 result.normal:
            // let empty_pos = result.position + result.normal;
        }
    }
}

更多详情请参见射线投射的完整示例

注意事项

bevy_voxel_world 最初是我正在开发的游戏的内部组件,但我认为它可能作为独立插件对我自己和可能对其他人有用,所以我决定将其分离出来并作为一个crate公开。

在当前状态下,仍有各种硬编码的假设,这些假设对我的用例来说足够好,但可能不适合所有人。随着时间的推移,目标是将 bevy_voxel_world 泛化并使其更加可配置。还有许多潜在的性能优化,我目前还没有优先考虑。

目前只支持"方块状"的Minecraft风格体素,不支持"半砖"。网格生成由 block-mesh-rs 处理,并且只使用"简单"算法(即,没有贪婪网格生成)。

欢迎反馈、问题和拉取请求!


Bevy 兼容性

bevybevy_voxel_world
0.14^0.8.0
0.130.4.0 - 0.8.0
0.120.3.6
0.110.2.2
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号