diff --git a/src/action/systems.rs b/src/action/systems.rs index bff68fa..b41ea03 100644 --- a/src/action/systems.rs +++ b/src/action/systems.rs @@ -8,7 +8,7 @@ use bevy::prelude::{ use bevy_rapier3d::{ prelude::{ CollisionGroups, ExternalForce, Group, MultibodyJoint, QueryFilter, RapierConfiguration, - RapierContext, ReadMassProperties, Velocity, + RapierContext, ReadMassProperties, RevoluteJoint, Velocity, }, rapier::prelude::JointAxis, }; @@ -87,12 +87,12 @@ pub(super) fn falling_cat( pub(super) fn input_forces( settings: Res, input: Res, - mut braking_query: Query<&mut MultibodyJoint, With>, + mut braking_query: Query<&mut MultibodyJoint, (Without, With)>, mut body_query: Query< (&Transform, &mut ExternalForce), (With, Without), >, - mut steering_query: Query<&mut Transform, With>, + mut steering_query: Query<&mut MultibodyJoint, With>, ) { let (xform, mut forces) = body_query.single_mut(); @@ -105,12 +105,16 @@ pub(super) fn input_forces( // brake for mut motor in braking_query.iter_mut() { let factor = if input.brake { settings.accel } else { 0.0 }; - motor.data.set_motor_velocity(JointAxis::X, 0.0, factor); + motor.data = *motor.data.set_motor_velocity(JointAxis::X, 0.0, factor); + //dbg!(&motor); } // steering let angle = input.yaw * (PI / 2.0); - //let mut steering = steering_query.single_mut(); + let mut steering = steering_query.single_mut(); + steering.data = *steering + .data + .set_motor_position(JointAxis::AngY, angle, 20.0, 1.0); //steering.rotation = Quat::from_axis_angle(Vec3::Y, angle + // 90.0f32.to_radians()); dbg!(steering.rotation); } diff --git a/src/bike/wheels.rs b/src/bike/wheels.rs index 2f418cb..5617f27 100644 --- a/src/bike/wheels.rs +++ b/src/bike/wheels.rs @@ -5,7 +5,7 @@ use bevy_rapier3d::prelude::{ RevoluteJointBuilder, RigidBody, Sleeping, TransformInterpolation, }; -use super::{CyberWheel, Meshterial, WheelConfig, BIKE_WHEEL_COLLISION_GROUP}; +use super::{CyberSteering, CyberWheel, Meshterial, WheelConfig, BIKE_WHEEL_COLLISION_GROUP}; pub fn spawn_tires( commands: &mut Commands, @@ -58,7 +58,7 @@ pub fn spawn_tires( let wheel_x = 0.0; let wheel_z = -conf.front_forward; let offset = Vec3::new(wheel_x, wheel_y, wheel_z); - wheel_poses.push(offset); + wheel_poses.push((offset, Some(CyberSteering))); } // rear @@ -66,10 +66,10 @@ pub fn spawn_tires( let wheel_x = 0.0; let wheel_z = conf.rear_back; let offset = Vec3::new(wheel_x, wheel_y, wheel_z); - wheel_poses.push(offset); + wheel_poses.push((offset, None)); } - for offset in wheel_poses { + for (offset, steering) in wheel_poses { let wheel_damping = Damping { linear_damping: 0.8, ..Default::default() @@ -88,8 +88,21 @@ pub fn spawn_tires( .insert(prismatic_joint) .id(); + let axel_parent = if let Some(steering) = steering { + let neck_builder = RevoluteJointBuilder::new(Vec3::Y); + let neck_joint = MultibodyJoint::new(fork_rb_entity, neck_builder); + let hub = commands + .spawn(RigidBody::Dynamic) + .insert(neck_joint) + .insert(steering) + .id(); + hub + } else { + fork_rb_entity + }; + let revolute_builder = RevoluteJointBuilder::new(Vec3::X); - let axel_joint = MultibodyJoint::new(fork_rb_entity, revolute_builder); + let axel_joint = MultibodyJoint::new(axel_parent, revolute_builder); commands.spawn(pbr_bundle.clone()).insert(( wheel_collider,