#magica-voxel #scene-graph #bevy #voxel #graphics

bevy_vox_scene

一个用于加载Magica Voxel世界文件并将渲染材料直接作为场景图渲染到Bevy的Bevy引擎插件

15个版本 (5个破坏性版本)

0.14.0 2024年7月4日
0.13.0 2024年2月22日
0.12.1 2024年2月18日
0.11.5 2024年1月22日
0.9.0 2024年1月7日

#175 in 游戏开发

MIT许可证

97KB
2K SLoC

bevy_vox_scene

Latest version docs.rs CI dependency status Bevy tracking codecov

一个用于Bevy引擎的插件,允许直接将Magica Voxel.vox文件加载到Bevy场景图中。bevy_vox_scene是从出色的bevy_vox_mesh中分叉出来的。

为什么选择bevy-vox-scene

与其他加载单个具有体素颜色但没有其他材质属性的体素包不同,bevy_vox_scene可以从Magica Voxel世界文件中加载整个场景图,并尝试从Magica Voxel的渲染选项卡中重新创建材质属性。这意味着您可以在Bevy中创建一个近似Magica Voxel光线追踪渲染的场景,但具有Bevy的实时交互帧率。

使用Magica Voxel作为您的Bevy关卡编辑器。

这是由Magica Voxel的射线追踪器渲染的研究示例场景在Magica Voxel中渲染的研究场景

这是同一场景在Bevy中的样子: Bevy中的同一场景

除了“云”之外,所有Magica Voxel材质类型都受支持。Bevy的屏幕空间透射渲染玻璃材质做得很好。

bevy_vox_scene通过为场景生成一系列纹理图集来实现这一点,以捕捉场景中每种Voxel类型的不同颜色、金属度、粗糙度、辐射和透明度。

用法

  1. 使用命令行(cargo add bevy_vox_scene)或将其添加到Cargo.toml中添加包
[dependencies]
bevy_vox_scene = "0.14.0"

然后在代码中

use bevy::prelude::*;
use bevy_vox_scene::{VoxScenePlugin, VoxelSceneBundle}; // 2.

fn main() {
    App::new()
        .add_plugins((DefaultPlugins, VoxScenePlugin)) // 3.
        .add_systems(Startup, setup)
        .run();
}

fn setup(mut commands: Commands, assets: Res<AssetServer>) {
    commands.spawn(VoxelSceneBundle { // 4.
        scene: assets.load("study.vox#workstation/desk"),
        ..default()
    });
}
  1. 导入库。
  2. 将插件添加到应用中。
  3. 使用 VoxelSceneBundle 创建场景图。或者,使用在 MagicaVoxel 中分配给节点的名称,创建场景图中的任何节点,包括单个模型。

查看 examples/ 目录中的完整工作示例。要运行示例,请在终端中输入以下内容

cargo run --example <example name>
  • 要使用场景钩子修改场景层次结构中的实体,请参阅 modify-scene 示例
  • 如果您想要发光的自发光体素,请添加HDR和启用泛光的相机。请参阅 emissive-model 示例
  • 启用屏幕空间环境遮挡可以使您的体素场景更加突出。请参阅 ssao-model 示例
  • 如果您想让玻璃体素折射场景中的其他对象,请在您的 camera3d 上启用镜面反射传输。请参阅 transmission-scene 示例

Bevy和Magica Voxel兼容性

Bevy版本 Magica Voxel版本 bevy-vox-scene 版本
0.12 0.99.6 0.9, 0.10, 0.11, 0.12
0.13 0.13
0.14 0.14

限制和解决方案

  • 当将单个命名的网格作为子资源(assets.load("study.vox#desk"))实例化时,您需要确保在 Magica Voxel 中分配给它的名称在文件中是唯一的。避免使用以单词 materialmodel 开头的名称,因为这些是为构成场景的各个子资源保留的。
  • 在 MagicaVoxel 的光线追踪渲染中,自发光材料有助于场景照明。目前,自发光材料在 Bevy 中不会这样做,它们只是发光。如果未来 Bevy 实现了全局照明系统,则自发光材料将有助于照明。
  • 目前不支持 MagicaVoxel 的“云”材料。
  • 使用 16x16 像素纹理图集(从网格的 UV 中索引)来实现材料属性(颜色、粗糙度、金属度、自发光、透明度)。因此,无法执行“Minecraft”风格的纹理(纹理覆盖每个体素)。对于该效果,请考虑使用 bevy_vox_mesh

透明材料

TLDR:使用 Magica Voxel 的世界编辑器将包含玻璃体素的模型分割成凸块。

Magica Voxel技巧:您可能需要手动将透射模型移动到 Magica Voxel 的渲染顺序的最后,以便其他模型可以通过它们可见。在具有玻璃体素的模型上按“顺序 -> 最后”。尽管场景层次结构将使用 VoxelSceneBundle 导入到 Bevy,但 Magica Voxel 文件中同级节点的顺序对 Bevy 渲染没有影响。

  • 如果您有一个包含玻璃体素的凹模型,该模型的其余部分将无法通过玻璃体素可见。这是 Bevy 屏幕空间镜面反射传输系统的限制。为了克服这一限制,请使用 Magica Voxel 世界编辑器将包含玻璃元素的模型分解为每个都是凸形的单独模型。
  • Bevy 的 StandardMaterial 只允许每个材料一个折射率(IoR)。模型中的 IoR 是平均的,得到这个值。如果您的场景包含具有广泛不同的 IoR 的透射材料(例如,水和钻石),并且您认为这些 IoR 的平均值对场景有显著的可见影响,请考虑将模型分解为每个透射介质单独的网格。
  • Bevy的屏幕空间环境遮挡(SSAO)似乎可以阻挡粗糙玻璃材料带来的模糊效果。如果您有粗糙的玻璃材料,请考虑不使用SSAO。

致谢

源自Lucas A.的优秀bevy_vox_mesh

bevy-vox-mesh一样,bevy-vox-scene使用dot-vox来解析vox文件,并使用来自block-mesh-rshttps://github.com/bonsairobo/block-mesh-rs)的贪婪网格器来创建高效的网格。

VoxelSceneHook由Nicola Papale从bevy-scene-hook修改而来。

依赖项

~37–75MB
~1.5M SLoC