起步
Bevy是一个使用Rust编写的高效,易于使用且编译快速的数据驱动游戏引擎。它基于ECS(Entity-Component-System,实体-组件-系统)的范例并允许定义插件,即具有共同目标的成套组件、系统和资源。
bevy_rapier2d和bevy_rapier3d库通过使用Bevy的插件系统集成了Rapier到Bevy当中。为了获取bevy-rapier最好的效果,多个特性可被选择性启用:
debug-render-2d/debug-render-3d: 启用调试渲染插件simd-stable: 使用wide库启用严格的SIMD优化。有受限的跨平台支持但是可以与稳定版的Rust编译器一同使用。simd-nightly: 使用packed_simd库启用严格的SIMD优化。有极好的跨平台支持但是需要与nightly版Rust编译器一同使用。parallel: 使用rayon库启用物理管线的并行。serde-serialize: 使用serde启用物理组件的序列化。enhanced-determinism: 可在严格执行 IEEE 754-2008 标准的所有 32 位和 64 位平台上实现跨平台确定性(假设代码的其他部分也是确定性的)。这包括大多数现代处理器和 WASM 目标机。wasm-bindgen: 启用rapier作为WASM库的一个依赖使用,通过wasm-bindgen编译。
Cargo示例
为了使用这些库,第一步是在你的Cargo.toml中添加一个依赖:
[dependencies]# TODO: 使用最新的版本号替代“*”。bevy = "*"bevy_rapier2d = "*"[dependencies]# TODO: 使用最新的版本号替代“*”。bevy = "*"bevy_rapier3d = "*"如果你需要启用一些Rapier特性,像SIMD,parallelism,serialization或者determinism,你可以在bevy_rapier上直接启用它们。
[dependencies]# TODO: 使用最新的版本号替代“*”。bevy = "*"bevy_rapier2d = { version = "*", features = [ "simd-stable", "debug-render-2d" ] }[dependencies]# TODO: 使用最新的版本号替代“*”。bevy = "*"bevy_rapier3d = { version = "*", features = [ "simd-stable", "debug-render-3d" ] }基本模拟示例
下面是main.rs文件的一个基本示例。它创建了一个在固定地面上弹跳的球。有关本示例中使用的元素的详细信息,请参阅本指南的后续章节。
use bevy::prelude::*;use bevy_rapier2d::prelude::*;
fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0)) .add_plugins(RapierDebugRenderPlugin::default()) .add_systems(Startup, setup_graphics) .add_systems(Startup, setup_physics) .add_systems(Update, print_ball_altitude) .run();}
fn setup_graphics(mut commands: Commands) { // Add a camera so we can see the debug-render. commands.spawn(Camera2dBundle::default());}
fn setup_physics(mut commands: Commands) { /* Create the ground. */ commands .spawn(Collider::cuboid(500.0, 50.0)) .insert(TransformBundle::from(Transform::from_xyz(0.0, -100.0, 0.0)));
/* Create the bouncing ball. */ commands .spawn(RigidBody::Dynamic) .insert(Collider::ball(50.0)) .insert(Restitution::coefficient(0.7)) .insert(TransformBundle::from(Transform::from_xyz(0.0, 400.0, 0.0)));}
fn print_ball_altitude(positions: Query<&Transform, With<RigidBody>>) { for transform in positions.iter() { println!("Ball altitude: {}", transform.translation.y); }}use bevy::prelude::*;use bevy_rapier3d::prelude::*;
fn main() { App::new() .add_plugins(DefaultPlugins) .add_plugins(RapierPhysicsPlugin::<NoUserData>::default()) .add_plugins(RapierDebugRenderPlugin::default()) .add_systems(Startup, setup_graphics) .add_systems(Startup, setup_physics) .add_systems(Update, print_ball_altitude) .run();}
fn setup_graphics(mut commands: Commands) { // Add a camera so we can see the debug-render. commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-3.0, 3.0, 10.0).looking_at(Vec3::ZERO, Vec3::Y), ..Default::default() });}
fn setup_physics(mut commands: Commands) { /* Create the ground. */ commands .spawn(Collider::cuboid(100.0, 0.1, 100.0)) .insert(TransformBundle::from(Transform::from_xyz(0.0, -2.0, 0.0)));
/* Create the bouncing ball. */ commands .spawn(RigidBody::Dynamic) .insert(Collider::ball(0.5)) .insert(Restitution::coefficient(0.7)) .insert(TransformBundle::from(Transform::from_xyz(0.0, 4.0, 0.0)));}
fn print_ball_altitude(mut positions: Query<&mut Transform, With<RigidBody>>) { for mut transform in positions.iter_mut() { dbg!(transform.rotation.to_axis_angle()); transform.rotation = Quat::from_rotation_z(270_f32.to_radians()); //println!("Ball altitude: {}", transform.translation.y); }}调试渲染器
bevy_rapier插件同时有一个调试渲染器(要么是debug-render-2d,要么是debug-render-3d)来帮助可视化物理引擎所看到的内容。这可以帮助修复一些漏洞,像碰撞箱没有合适地与你的图形表示对齐。调试渲染器会被启用于:
- 启用
debug-render-2d或debug-render-3d的bevy-rapier的Cargo特性。 - 添加插件
RapierDebugRenderPlugin到Bevy应用。