#bevy #collider #2d #png #rapier #physics-engine

bevy_collider_gen

一个用于从具有透明度的图像中为bevy应用程序生成碰撞体的库

4个版本

0.2.2 2024年8月14日
0.2.1 2024年5月12日
0.2.0 2024年3月4日
0.1.0 2024年3月2日

#146 in 游戏开发

Download history 9/week @ 2024-05-06 158/week @ 2024-05-13 19/week @ 2024-05-20 5/week @ 2024-06-03 3/week @ 2024-06-10 7/week @ 2024-06-24 21/week @ 2024-07-01 18/week @ 2024-07-29 1/week @ 2024-08-05 137/week @ 2024-08-12

每月156次下载

MIT/Apache

3MB
261

bevy_collider_gen

Crates.io Crates.io MIT/Apache 2.0

一个用于从具有透明度的图像中为bevy应用程序生成2D碰撞体的库

指定依赖项

默认情况下,bevy_rapier2d和avian2d(以前称为bevy_xpbd_2d)都被启用。这是为了帮助提供开箱即用的体验,特别是能够运行示例并尝试。

但您可能只想使用支持的一个物理引擎,因此当您在自己的crate中使用它时,请用以下内容填写bevy_collider_gen依赖项:

[dependencies.bevy_collider_gen]
# replace "*" with the most recent version of bevy_collider_gen
version = "*"
features = ["rapier2d"]
default-features = false

例如,对于bevy_rapier2d

[dependencies.bevy_collider_gen]
# replace "*" with the most recent version of bevy_collider_gen
version = "*"
features = ["avian2d"]
default-features = false

示例

example with a car, terrain, and boulders

要查看此功能的效果,您可以运行示例。在没有参数的情况下,它会在assets/sprite目录中生成具有png图像的各种碰撞体的场景

bevy_rapier2d

请注意,您必须启用rapier2d功能

cargo run --example rapier2d_colliders

avian2d

请注意,您必须启用avian2d功能

cargo run --example avian2d_colliders

您也可以指定图像的路径,示例将尝试为找到的对象生成一个或多个凸多边形碰撞体

关于/为什么

我在寻找一种方法来迭代一些具有复杂形状(而非简单几何形状)的2D场景,我想图像中应该有足够的信息来生成碰撞体,结果确实如此!因此,我将我的方法包装起来,以防其他人也能从中受益。

它是如何工作的

😄前往edges crate了解更多 https://github.com/shnewto/edges

注意事项

  • 如文档中所述,此实现要求图像具有透明度,以便区分对象和非对象 :)
  • 我想象对于生成较大规模的内容,即生成大于数百像素计数的精灵集的碰撞体,此实现在运行时可能不会高效。我建议序列化您喜欢的碰撞体并在应用程序中反序列化,而不是在需要性能提升时在加载时进行所有数值计算

为assets/sprite/car.png生成的碰撞体示例

(如图所示,这是您可以期望的类型,而不是可运行的bevy应用程序示例。那是在上面几个标题的地方)

凸多边形(仅bevy_raiper2d)

convex polyline collider on an upside down car sprite

多边形

polyline collider on an upside down car sprite

凸包

convex hull collider on an upside down car sprite

高度场

当前实现的最佳情况是,您生成的高度场图像要么位于图像中心,要么跨越整个图像宽度...

heightfield collider on an upside down car sprite

凸分解

我没有直接添加凸分解支持,因为当精灵很小,并且碰撞力强时,它们有点不可靠(由于rapier的依赖项中的边界索引导致的偶尔恐慌 💀)。但如果您想使用凸分解碰撞器,您可以使用类似下面的方法从您的图像的边缘坐标构建它们

let sprite_image = image_assets.get(sprite_handle.unwrap()).unwrap();
let edges = Edges::from(sprite_image)
let edge_coordinate_groups = edges.multi_image_edge_translated();
for coords in edge_coordinate_groups {
    let indices: Vec<[u32; 2]> = (0..coords.len()).map(|i| [i as u32, i as u32]).collect();
    let collider = Collider::convex_decomposition(&coords, &indices);
    commands.spawn((
        collider,
        RigidBody::Fixed,
        SpriteBundle {
            texture: sprite_handle.unwrap().clone(),
            ..default()
        },
    ));
}

convex decomposition collider on a car sprite

许可

本存储库中的所有代码均采用以下任一许可证双授权:

由您选择。

依赖关系

~36–75MB
~1.5M SLoC