#blender #bevy #gamedev

bevy_blender

bevy_blender是一个Bevy库,允许您直接从.blend文件中使用在Blender中创建的资产

1个不稳定版本

0.1.0 2021年6月28日

#816 in 游戏开发

MIT许可证

1MB
133

bevy_blender

Crate version Crate license

bevy_blender是一个Bevy库,允许您直接从Blender的.blend文件中使用资产。

目的

  1. 我正在学习Rust,这似乎是一个不太难也不太简单的问题。
  2. 我希望能够在同一个.blend文件中维护多个资产,而不用担心导出它们。
  3. 这似乎是为Bevy项目做出贡献的好方法。
  1. Arsenal是一个项目,旨在将Blender作为创建Bevy游戏的UI。
  2. Reddit/Github用户sdfgeoff创建了Blender Bevy Toolkit,它将Blender对象导出到Bevy可读的场景文件(以及一些其他有趣的东西)。

这两个项目都很不错,但都不符合我的需求。它们都作为Bevy游戏引擎的扩展,将Blender几乎作为前端框架。我只想在Blender中创建资产,并有一个非常简单的方法在Bevy中访问这些资产,中间工作尽可能少。

致谢

  1. 该项目在很大程度上是模仿了bevy_stl项目,所以感谢nilclass!
  2. 大部分繁重的工作都是使用Blend crate完成的,感谢lukebitts!

用法

  1. bevy_blender添加到您的Cargo.toml依赖项。
  2. bevy_blender::BlenderPlugin插件添加到bevy App
  3. 使用包含宏的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 封顶缺失,更多详细信息请参阅限制部分):demo bevy window

愿望

目前,bevy_blend 只能从 .blend 文件中加载网格数据。我计划扩展它,以便用户可以导入 Blender 和 Bevy 都支持的所有资产类型(假设存在某种合理的方法可以在两者之间进行转换)。最终,我想创建一个 BlenderObjectBundle,它将加载属于 Blender 对象及其后代的全部资产。目标是,除了轻微的渲染差异外,在 Blender 中渲染的对象将在 Bevy 中渲染得一样。

如果您有关于如何使用此项目的其他想法,请告诉我!

已知限制

  • 目前仅支持三角形和四边形面,ngon 面的支持正在开发中。
  • 仅支持非压缩的 .blend 文件。虽然 Blender 使用标准 zlib 压缩(我认为是这样),所以应该很容易检测到压缩的 .blend 文件并将其解压。
  • 仅构建命名网格,子网格必须手动构建并相对于父网格放置。请参阅上述愿望部分。
  • 在构建网格之前不应用 Blender 修改器。
  • 每次调用 asset_server.load() 时都会读取 .blend 文件并解析所有网格。理想情况下,我们只会解析一次 .blend 文件,然后使所有网格都可用。仍在寻找最佳实现方式。

依赖关系

~39–76MB
~1M SLoC