diff --git a/voxygen/anim/src/character/mount.rs b/voxygen/anim/src/character/mount.rs index 8d5fc33535..4f6bcebe22 100644 --- a/voxygen/anim/src/character/mount.rs +++ b/voxygen/anim/src/character/mount.rs @@ -152,7 +152,9 @@ impl Animation for MountAnimation { next.lantern.orientation = next.hand_r.orientation.inverse() * Quaternion::rotation_x(fast * 0.1) * Quaternion::rotation_y(fast2 * 0.1); - } + } else { + next.lantern.position = Vec3::new(s_a.lantern.0, s_a.lantern.1, s_a.lantern.2); + }; next.glider.position = Vec3::new(0.0, 0.0, 10.0); next.glider.scale = Vec3::one() * 0.0; diff --git a/voxygen/anim/src/quadruped_medium/jump.rs b/voxygen/anim/src/quadruped_medium/jump.rs index 850bdc5dd8..ee0f886a34 100644 --- a/voxygen/anim/src/quadruped_medium/jump.rs +++ b/voxygen/anim/src/quadruped_medium/jump.rs @@ -6,7 +6,7 @@ use super::{ pub struct JumpAnimation; impl Animation for JumpAnimation { - type Dependency<'a> = f32; + type Dependency<'a> = (f32, Vec3, Vec3); type Skeleton = QuadrupedMediumSkeleton; #[cfg(feature = "use-dyn-lib")] @@ -15,7 +15,7 @@ impl Animation for JumpAnimation { #[cfg_attr(feature = "be-dyn-lib", export_name = "quadruped_medium_jump")] fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, - _global_time: Self::Dependency<'a>, + (_global_time, velocity, avg_vel): Self::Dependency<'a>, _anim_time: f32, _rate: &mut f32, s_a: &SkeletonAttr, @@ -33,38 +33,62 @@ impl Animation for JumpAnimation { next.foot_bl.scale = Vec3::one() * 0.96; next.foot_br.scale = Vec3::one() * 0.96; next.ears.scale = Vec3::one() * 1.02; + let speed = Vec2::::from(velocity).magnitude(); + let velocityalt = speed.max(1.0); + let normalize = velocityalt / 22.0; + + let x_tilt = (avg_vel.z.atan2(avg_vel.xy().magnitude()) * normalize).max(-0.35); + let x_tilt = if velocityalt < 2.0 { + x_tilt.abs() + } else { + x_tilt + }; + println!("{} days", x_tilt); next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); + next.head.orientation = Quaternion::rotation_x(x_tilt * -0.5); next.neck.position = Vec3::new(0.0, s_a.neck.0, s_a.neck.1); + next.neck.orientation = Quaternion::rotation_x(x_tilt * -1.0); next.jaw.position = Vec3::new(0.0, s_a.jaw.0, s_a.jaw.1); next.jaw.orientation = Quaternion::rotation_x(0.0); next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1); + next.tail.orientation = Quaternion::rotation_x(-0.6 * normalize + x_tilt * 2.0); next.torso_front.position = Vec3::new(0.0, s_a.torso_front.0, s_a.torso_front.1); - next.torso_front.orientation = Quaternion::rotation_y(0.0); + next.torso_front.orientation = Quaternion::rotation_x(x_tilt * 1.9); next.torso_back.position = Vec3::new(0.0, s_a.torso_back.0, s_a.torso_back.1); + next.torso_back.orientation = Quaternion::rotation_x(x_tilt * -1.2); next.ears.position = Vec3::new(0.0, s_a.ears.0, s_a.ears.1); + next.ears.orientation = Quaternion::rotation_x(x_tilt * 1.5); next.leg_fl.position = Vec3::new(-s_a.leg_f.0, s_a.leg_f.1, s_a.leg_f.2); + next.leg_fl.orientation = Quaternion::rotation_x(1.2 * normalize + x_tilt * 0.8); next.leg_fr.position = Vec3::new(s_a.leg_f.0, s_a.leg_f.1, s_a.leg_f.2); + next.leg_fr.orientation = Quaternion::rotation_x(1.2 * normalize + x_tilt * 0.8); next.leg_bl.position = Vec3::new(-s_a.leg_b.0, s_a.leg_b.1, s_a.leg_b.2); + next.leg_bl.orientation = Quaternion::rotation_x(-0.8 * normalize + x_tilt * -0.8); next.leg_br.position = Vec3::new(s_a.leg_b.0, s_a.leg_b.1, s_a.leg_b.2); + next.leg_br.orientation = Quaternion::rotation_x(-0.8 * normalize + x_tilt * -0.8); next.foot_fl.position = Vec3::new(-s_a.feet_f.0, s_a.feet_f.1, s_a.feet_f.2); + next.foot_fl.orientation = Quaternion::rotation_x(-0.4 * normalize + x_tilt * -0.4); next.foot_fr.position = Vec3::new(s_a.feet_f.0, s_a.feet_f.1, s_a.feet_f.2); + next.foot_fr.orientation = Quaternion::rotation_x(-0.4 * normalize + x_tilt * -0.4); next.foot_bl.position = Vec3::new(-s_a.feet_b.0, s_a.feet_b.1, s_a.feet_b.2); + next.foot_bl.orientation = Quaternion::rotation_x(-0.4 * normalize + x_tilt * -0.4); next.foot_br.position = Vec3::new(s_a.feet_b.0, s_a.feet_b.1, s_a.feet_b.2); + next.foot_br.orientation = Quaternion::rotation_x(-0.4 * normalize + x_tilt * -0.4); next } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 306f518665..8d38454e5a 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -1989,7 +1989,7 @@ impl FigureMgr { (false, _, false) => { anim::quadruped_medium::JumpAnimation::update_skeleton( &QuadrupedMediumSkeleton::default(), - time, + (time, rel_vel, rel_avg_vel), state.state_time, &mut state_animation_rate, skeleton_attr,