1个不稳定版本
0.1.0 | 2021年6月28日 |
---|
#816 in 游戏开发
1MB
133 行
bevy_blender
bevy_blender是一个Bevy库,允许您直接从Blender的.blend文件中使用资产。
目的
- 我正在学习Rust,这似乎是一个不太难也不太简单的问题。
- 我希望能够在同一个.blend文件中维护多个资产,而不用担心导出它们。
- 这似乎是为Bevy项目做出贡献的好方法。
相关工作
- Arsenal是一个项目,旨在将Blender作为创建Bevy游戏的UI。
- Reddit/Github用户sdfgeoff创建了Blender Bevy Toolkit,它将Blender对象导出到Bevy可读的场景文件(以及一些其他有趣的东西)。
这两个项目都很不错,但都不符合我的需求。它们都作为Bevy游戏引擎的扩展,将Blender几乎作为前端框架。我只想在Blender中创建资产,并有一个非常简单的方法在Bevy中访问这些资产,中间工作尽可能少。
致谢
- 该项目在很大程度上是模仿了bevy_stl项目,所以感谢nilclass!
- 大部分繁重的工作都是使用Blend crate完成的,感谢lukebitts!
用法
- 将
bevy_blender
添加到您的Cargo.toml
依赖项。 - 将
bevy_blender::BlenderPlugin
插件添加到bevyApp
- 使用包含宏的
asset_server.load
加载Blender网格资产。例如:asset_server.load(blender_mesh!("blend_file.blend", "mesh_name"))
如果Blender中的资产名称以下划线开头,则不会加载。您可以使用此功能在.blend文件中包含额外的资产,而无需将它们加载到AssetServer。
示例
fn main() {
App::build()
.add_plugin(bevy_blender::BlenderPlugin)
.add_startup_system(setup.system())
// ...
.run();
}
fn setup(commands: &mut Commands, asset_server: Res<AssetServer>, mut materials: ResMut<Assets<StandardMaterial>>) {
commands.spawn_bundle(PbrBundle {
mesh: asset_server.load(blender_mesh!("demo.blend", "Suzanne")),
material: materials.add(Color::rgb(0.9, 0.4, 0.3).into()),
..Default::default()
})
// ...
}
完整的示例可以在 examples/demo.rs
中找到。只需运行 cargo run --example demo
来执行。这将打开位于 assets/demo.blend
的 .blend 文件。运行此演示将看起来像这样(注意圆柱上的 ngon 封顶缺失,更多详细信息请参阅限制部分):
愿望
目前,bevy_blend 只能从 .blend 文件中加载网格数据。我计划扩展它,以便用户可以导入 Blender 和 Bevy 都支持的所有资产类型(假设存在某种合理的方法可以在两者之间进行转换)。最终,我想创建一个 BlenderObjectBundle
,它将加载属于 Blender 对象及其后代的全部资产。目标是,除了轻微的渲染差异外,在 Blender 中渲染的对象将在 Bevy 中渲染得一样。
如果您有关于如何使用此项目的其他想法,请告诉我!
已知限制
- 目前仅支持三角形和四边形面,ngon 面的支持正在开发中。
- 仅支持非压缩的 .blend 文件。虽然 Blender 使用标准 zlib 压缩(我认为是这样),所以应该很容易检测到压缩的 .blend 文件并将其解压。
- 仅构建命名网格,子网格必须手动构建并相对于父网格放置。请参阅上述愿望部分。
- 在构建网格之前不应用 Blender 修改器。
- 每次调用 asset_server.load() 时都会读取 .blend 文件并解析所有网格。理想情况下,我们只会解析一次 .blend 文件,然后使所有网格都可用。仍在寻找最佳实现方式。
依赖关系
~39–76MB
~1M SLoC