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日 |
#24 in 游戏开发
2,270 每月下载量
用于 9 crates
1MB
16K SLoC
Avian 是一个为 Bevy游戏引擎 驱动的ECS 2D和3D物理引擎。
设计
以下是一些Avian中使用的核心设计原则。
- 为Bevy制作,适用于Bevy。 不在现有引擎周围添加包装。
- 提供舒适且熟悉的API。 舒适性是良好体验的关键。
- 尽可能利用ECS。 引擎应该感觉像是Bevy的一部分,而无需维护一个单独的物理世界。
- 使用高度模块化的插件架构。 用户应该能够用自己的实现替换引擎的部分。
- 拥有良好的文档。 如果不知道如何使用,物理引擎就没有意义。
功能
以下是一些Avian当前的特性。
- 动态、运动学和静态刚体
- 线性和角速度
- 外部力、扭矩和冲量
- 重力和重力缩放
- 线性和角阻尼
- 锁定平移和旋转轴
- 刚体优先级
- 连续碰撞检测(CCD)
- 自动休眠以停用
- 由 Parry 提供的碰撞检测
- 具有可配置碰撞层、密度、材料属性等的碰撞体
- 为网格和整个场景生成碰撞体
- 碰撞事件
- 访问碰撞实体
- 使用自定义系统过滤和修改碰撞
- 手动接触查询和交点测试
- 约束和关节
- 内置几种关节类型:固定、距离、滑动、旋转、球形
- 支持使用XPBD自定义关节和其他约束
- 空间查询
- 光线投射、形状投射、点投影和交点测试
- 光线投射和形状投射的舒适组件API
- 灵活的
SpatialQuery
系统参数 - 空间查询过滤器
- 碰撞体、AABB、接触、关节、休眠、轴和空间查询的调试渲染
- 可配置的调度和高度可定制性
- 高度模块化插件架构,自由扩展和替换引擎的部分
- 支持自定义碰撞后端
f32
/f64
精度(默认为f32
)
您可以在 docs.rs 上的目录中找到更完整的列表和文档。
文档
使用示例
首先,将 avian2d
或 avian3d
添加到您的 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()
});
}
更多示例
您可以在 /crates/avian2d/examples 和 /crates/avian3d/examples 中找到许多 2D 和 3D 示例。
这些示例支持 f32
和 f64
精度,因此代码中包含一些依赖于功能的类型,如 Scalar
和 Vector
。在实际使用中这些并不需要,因此您可以根据您选择的功能只使用 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 版本
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...)
- 关节电机
- 关节,即多体关节
- 适当的跨平台确定性
- 软体(布料和可变形固体)
- 也许流体模拟
贡献
如果您遇到任何问题,请随时提出问题或创建 pull request。对于较大的更改和添加,最好在创建 pull request 之前先提出问题或询问我的意见。
您还可以在 Bevy Discord 服务器上的 Avian Physics
线路中寻求帮助或提问,该线路位于 #crate-help
。我在 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)
。
依赖项
~20-61MB
~1M SLoC