ITADN
Jondolf/avian
Jondolf/avian · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Avian Physics

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

Avian 是一个基于 ECS 的 2D 和 3D 物理引擎,适用于 Bevy 游戏引擎


设计

以下是 Avian 中使用的部分核心设计原则。

  • 基于 Bevy 构建,专为 Bevy 服务。 不对现有引擎进行封装。
  • 提供符合人体工程学且熟悉的 API。 人体工程学是良好体验的关键。
  • 尽可能利用 ECS。 引擎应感觉是 Bevy 的一部分,并且不应 需要维护一个独立的物理世界。
  • 采用高度模块化的插件架构。 用户应能够用他们自己的实现 替换引擎的部分组件。
  • 拥有良好的文档。 如果你不知道如何使用,物理引擎就没有意义。

功能

以下是 Avian 当前的一些功能。

  • 动态、运动学和静态刚体
    • 线速度和角速度
    • 外力、扭矩和冲量
    • 重力和重力缩放
    • 线性和角阻尼
    • 锁定平移和旋转轴
    • 刚体主导性
    • 连续碰撞检测 (CCD)
    • 带有休眠的自动停用
  • Parry 驱动的碰撞检测
    • 具有可配置碰撞层、密度、材料属性等的碰撞体
    • 为网格和整个场景生成碰撞体
    • 碰撞事件
    • 访问碰撞实体
    • 使用碰撞钩子过滤和修改碰撞
    • 手动接触查询和相交测试
  • 约束和关节
    • 多种内置关节类型:固定、距离、棱柱、旋转、球面
    • 使用 XPBD 支持自定义关节和其他约束
  • 空间查询
    • 射线投射、形状投射、点投影和相交测试
    • 用于射线投射和形状投射的人体工学组件式 API
    • 灵活的 SpatialQuery 系统参数
    • 空间查询过滤器
  • 用于固定时间步长的 Transform 插值和外推
  • 用于碰撞体、AABB、接触点、关节、空间查询等的调试渲染
  • 可配置的调度和高度可定制性
  • 高度模块化的插件架构,自由扩展和替换引擎的部分
  • 支持自定义碰撞后端
  • f32/f64 精度(默认 f32

你可以在 目录 的 docs.rs 上找到更完整的列表及文档。

文档

使用示例

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

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

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

# If you want to use the most up-to-date version, you can follow the main branch:
[dependencies]
avian3d = { git = "https://github.com/avianphysics/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),
        Mesh3d(meshes.add(Cylinder::new(4.0, 0.1))),
        MeshMaterial3d(materials.add(Color::WHITE)),
    ));

    // 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)),
        Mesh3d(meshes.add(Cuboid::from_length(1.0))),
        MeshMaterial3d(materials.add(Color::srgb_u8(124, 144, 255))),
        Transform::from_xyz(0.0, 4.0, 0.0),
    ));

    // Light
    commands.spawn((
        PointLight {
            shadow_maps_enabled: true,
            ..default()
        },
        Transform::from_xyz(4.0, 8.0, 4.0),
    ));

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

A spinning cube falling onto a circular platform

更多示例

你可以在 /crates/avian2d/examples/crates/avian3d/examples 中分别找到大量 2D 和 3D 示例。

这些示例同时支持 f32f64 精度,因此代码中包含一些依赖特性的类型,例如 RealRVector。 在实际使用中,这些类型并非必需,因此你可以根据所选的特性直接使用 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"

版本对照表

BevyAvian
0.190.7
0.180.5-0.6
0.170.4
0.160.3
0.150.2
0.140.1

Avian 提供了每个版本的迁移指南

Bevy XPBD 版本(Avian 的前身)
BevyBevy XPBD
0.140.5
0.130.4
0.120.3
0.110.2
0.100.1

贡献

如果您遇到任何问题,请随时提交 issue 或创建 pull request。 对于较大的更改和新增内容,最好在创建 pull request 之前先提交 issue 或向我征求意见。 在贡献之前,请确保审阅我们的 AI 政策

我们还有一个自己的 Avian Dev Discord 服务器, 用于讨论与 Avian 或其他物理主题相关的发展事宜。如果您想聊天或跟进,请加入!

对于其他指导或问题,请考虑加入我们在 #ecosystem-crates 中的 Bevy Discord 服务器的 Avian Physics 主题。我在 Discord 上的用户名是 Jondolf@jondolfdev)。

致谢

非常感谢整个 Bevy 社区提供的巨大支持! 你们所有的贡献、见解和请求都在推动 Bevy 中物理引擎的发展, 这也是激励我构建尽可能好的引擎的动力。

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

许可证

Avian 是免费且开源的。本仓库中的所有代码均双重授权,采用以下任一方式:

供您选择。