use bevy::prelude::*;
use bevy_xpbd_3d::prelude::*;
use bevy_xpbd_3d_parenting::InternalForce;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
PhysicsPlugins::new(Update),
bevy_xpbd_3d_parenting::prelude::ParentingPlugin::new(Update),
))
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshs: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn(Camera3dBundle {
transform: Transform::from_xyz(0., 0., 10.),
..default()
});
commands.spawn((
PbrBundle {
mesh: meshs.add(Plane3d::default()),
material: materials.add(Color::BLACK),
..default()
},
RigidBody::Static,
));
commands.insert_resource(Gravity(Vec3::ZERO));
let mut cube = commands.spawn((
PbrBundle {
mesh: meshs.add(Cuboid::default()),
material: materials.add(Color::RED),
transform: Transform::from_xyz(0., 5., 0.),
..default()
},
RigidBody::Dynamic,
ExternalForce::ZERO.with_persistence(false),
AsyncCollider(ComputedCollider::ConvexHull),
));
cube.with_children(|cube| {
cube.spawn((
PbrBundle {
mesh: meshs.add(Cuboid::default()),
material: materials.add(Color::rgb(0.5, 0.0, 0.0)),
transform: Transform::from_xyz(-3.0, 0.0, 0.0),
..default()
},
Collider::capsule(0.5, 0.5),
));
});
cube.with_children(|cube| {
cube.spawn((
PbrBundle {
mesh: meshs.add(Sphere::default().mesh().uv(16, 18)),
material: materials.add(Color::BLUE),
transform: Transform::from_xyz(3.0, 0.0, 0.0),
..default()
},
AsyncCollider(ComputedCollider::ConvexHull),
InternalForce::new_local_forward_right_up(0., 0., -3.0),
));
});
}