4 个版本

0.1.2 2024年8月10日
0.1.1 2024年7月13日
0.1.0 2024年7月5日
0.0.0 2024年5月27日

#155游戏开发

Download history 99/week @ 2024-05-21 65/week @ 2024-05-28 7/week @ 2024-06-04 6/week @ 2024-06-11 262/week @ 2024-07-02 525/week @ 2024-07-09 536/week @ 2024-07-16 680/week @ 2024-07-23 365/week @ 2024-07-30 612/week @ 2024-08-06 760/week @ 2024-08-13

2,518 每月下载量
用于 5 crate

MIT/Apache 协议

1MB
16K SLoC

Avian Physics

MIT/Apache 2.0 ci 2D crates.io 2D docs.rs 3D crates.io 3D docs.rs

Avian 是为 Bevy 游戏引擎 开发的,以 ECS 为驱动的 2D 和 3D 物理引擎。


设计

以下是一些 Avian 使用的主要设计原则。

  • 为 Bevy 制作,用于 Bevy。 不在现有引擎周围添加封装。
  • 提供舒适且熟悉的 API。 人体工程学对于良好的体验至关重要。
  • 尽可能多地利用 ECS。 引擎应该感觉像是 Bevy 的一部分,并且不需要维护一个单独的物理世界。
  • 使用高度模块化的插件架构。 用户应该能够用自己的实现替换引擎的部分。
  • 拥有良好的文档。 如果不知道如何使用,物理引擎就毫无意义。

特性

以下是一些 Avian 的当前特性。

  • 动态、运动学和静态刚体
    • 线性和角速度
    • 外力、扭矩和冲击
    • 重力及重力比例
    • 线性和角阻尼
    • 锁定平移和旋转轴
    • 刚体优先级
    • 连续碰撞检测 (CCD)
    • 自动休眠时的禁用
  • Parry 提供的碰撞检测
    • 可配置碰撞层、密度、材质属性等的碰撞体
    • 网格和整个场景的碰撞体生成
    • 碰撞事件
    • 访问碰撞实体
    • 使用自定义系统过滤和修改碰撞
    • 手动接触查询和交集测试
  • 约束和连接器
    • 几个内置连接器类型:固定、距离、滑动、旋转、球面
    • 使用 XPBD 支持自定义连接器和其他约束
  • 空间查询
    • 射线投射、形状投射、点投影和交集测试
    • 射线投射和形状投射的舒适组件化 API
    • 灵活的 SpatialQuery 系统参数
    • 空间查询过滤器
  • 碰撞体、AABB、接触、连接器、休眠、轴和空间查询的调试渲染
  • 可配置的调度和高度可定制性
  • 高度模块化的插件架构,可以自由扩展和替换引擎的部分
  • 支持自定义碰撞后端
  • f32/f64 精度(默认为 f32

您可以在 docs.rs 的 目录 中找到更完整的列表和相关文档。

文档

使用示例

首先,将 avian2davian3d 添加到您的 Cargo.toml 依赖项中

# For 2D applications:
[dependencies]
avian2d = "0.1"

# For 3D applications:
[dependencies]
avian3d = "0.1"

# If you want to use the most up-to-date version, you can follow the main branch:
[dependencies]
avian3d = { git = "https://github.com/Jondolf/avian", branch = "main" }

以下是一个非常简单的示例,其中具有初始角速度的立方体落在圆形平台上。这是 Bevy 的 3d_scene 示例的修改版。

use avian3d::prelude::*;
use bevy::prelude::*;

fn main() {
    App::new()
        // Enable physics
        .add_plugins((DefaultPlugins, PhysicsPlugins::default()))
        .add_systems(Startup, setup)
        .run();
}

fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    // Static physics object with a collision shape
    commands.spawn((
        RigidBody::Static,
        Collider::cylinder(4.0, 0.1),
        PbrBundle {
            mesh: meshes.add(Cylinder::new(4.0, 0.1)),
            material: materials.add(Color::WHITE),
            ..default()
        },
    ));

    // Dynamic physics object with a collision shape and initial angular velocity
    commands.spawn((
        RigidBody::Dynamic,
        Collider::cuboid(1.0, 1.0, 1.0),
        AngularVelocity(Vec3::new(2.5, 3.5, 1.5)),
        PbrBundle {
            mesh: meshes.add(Cuboid::new(1.0, 1.0, 1.0)),
            material: materials.add(Color::srgb_u8(124, 144, 255)),
            transform: Transform::from_xyz(0.0, 4.0, 0.0),
            ..default()
        },
    ));

    // Light
    commands.spawn(PointLightBundle {
        point_light: PointLight {
            shadows_enabled: true,
            ..default()
        },
        transform: Transform::from_xyz(4.0, 8.0, 4.0),
        ..default()
    });

    // Camera
    commands.spawn(Camera3dBundle {
        transform: Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Dir3::Y),
        ..default()
    });
}

A spinning cube falling onto a circular platform

更多示例

您可以在 /crates/avian2d/examples/crates/avian3d/examples 中找到许多 2D 和 3D 示例。

这些示例支持 f32f64 精度,因此代码中包含一些功能相关的类型,如 ScalarVector。在实际使用中,这些并不需要,因此您可以根据您选择的特性直接使用 f32f64 类型。

默认情况下,示例使用 f32。要运行 f64 版本,您需要禁用默认功能并手动选择维度和精度

# Manually specify dimension and precision. `parry-f64` enables collision detection using Parry.
cargo run --example cubes --no-default-features --features "3d f64 parry-f64"

支持的 Bevy 版本

Bevy Avian
0.14 0.1
Bevy XPBD 版本(Avian 的前身)
Bevy Bevy XPBD
0.14 0.5
0.13 0.4
0.12 0.3
0.11 0.2
0.10 0.1

未来特性

  • 每个实体的碰撞挂钩或回调
  • 激活碰撞的类型标志,例如针对特定刚体类型、传感器或父级的碰撞
  • 性能优化(更好的广相、并行求解器、合适的 SIMD...)
  • 关节电机
  • 关节,也称为多体关节
  • 跨平台确定性
  • 软体(布料和可变形固体)
  • 也许流体模拟

贡献

如果您遇到任何问题,请随时打开问题或创建拉取请求。对于较大的更改和添加,最好在创建拉取请求之前先打开一个问题或向我询问意见。

您还可以在 Bevy Discord 服务器上的 Avian Physics 线路中寻求帮助或提问 #crate-help。我的 Discord 用户名是 Jondolf (@jondolfdev)。

致谢

非常感谢整个 Bevy 社区提供的令人难以置信的支持!您所有的贡献、见解和请求都对推动 Bevy 中的物理状态起到了巨大的作用,这也是我不断努力构建最佳引擎的动力。

我还要特别感谢 Johan Helsing,他的灵感推动了这个项目,并在早期阶段给了我很大的帮助。他的原始 教程系列avian 存在的原因,没有他的支持和贡献,项目今天不会达到这样的水平。

许可证

Avian 是免费和开源的。此存储库中的所有代码都根据以下任一许可证双重许可:

根据您的选择。

依赖项

~19–60MB
~1M SLoC