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 游戏开发
97KB
2K SLoC
bevy_vox_scene
一个用于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的射线追踪器渲染的研究示例场景:
这是同一场景在Bevy中的样子:
除了“云”之外,所有Magica Voxel材质类型都受支持。Bevy的屏幕空间透射渲染玻璃材质做得很好。
bevy_vox_scene
通过为场景生成一系列纹理图集来实现这一点,以捕捉场景中每种Voxel类型的不同颜色、金属度、粗糙度、辐射和透明度。
用法
- 使用命令行(
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()
});
}
- 导入库。
- 将插件添加到应用中。
- 使用
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 中分配给它的名称在文件中是唯一的。避免使用以单词material
或model
开头的名称,因为这些是为构成场景的各个子资源保留的。 - 在 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-rs
(https://github.com/bonsairobo/block-mesh-rs)的贪婪网格器来创建高效的网格。
VoxelSceneHook
由Nicola Papale从bevy-scene-hook修改而来。
依赖项
~37–75MB
~1.5M SLoC