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 中将 avian2d 或 avian3d 添加到你的依赖项中:
# 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),
));
}
更多示例
你可以在 /crates/avian2d/examples 和 /crates/avian3d/examples 中分别找到大量 2D 和 3D 示例。
这些示例同时支持 f32 和 f64 精度,因此代码中包含一些依赖特性的类型,例如 Real 和 RVector。
在实际使用中,这些类型并非必需,因此你可以根据所选的特性直接使用 f32 或 f64 类型。
默认情况下,示例使用 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 | Avian |
|---|---|
| 0.19 | 0.7 |
| 0.18 | 0.5-0.6 |
| 0.17 | 0.4 |
| 0.16 | 0.3 |
| 0.15 | 0.2 |
| 0.14 | 0.1 |
Avian 提供了每个版本的迁移指南。
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 |
贡献
如果您遇到任何问题,请随时提交 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 是免费且开源的。本仓库中的所有代码均双重授权,采用以下任一方式:
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache 许可证,第 2.0 版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
供您选择。