From c53a711a9140b8c4ac34135ed8bb35fe0e9af692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20B=C3=B6klin?= Date: Sun, 6 Jun 2021 15:43:50 +0200 Subject: [PATCH] Prevent rotation from negative lift and fix glider ori in wield state --- common/src/states/glide_wield.rs | 4 ++-- common/systems/src/phys.rs | 29 +++++++++++++----------- voxygen/anim/src/character/glidewield.rs | 3 ++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/common/src/states/glide_wield.rs b/common/src/states/glide_wield.rs index 4a2b1a7cd1..93b007b417 100644 --- a/common/src/states/glide_wield.rs +++ b/common/src/states/glide_wield.rs @@ -36,8 +36,8 @@ impl CharacterBehavior for Data { glider.ori = glider.ori.slerped_towards( Ori::from(data.inputs.look_dir) .yawed_towards(data.ori.look_dir()) - .pitched_up(inline_tweak::tweak!(0.7)), - inline_tweak::tweak!(3.0) * data.dt.0, + .pitched_up(inline_tweak::tweak!(0.5)), + inline_tweak::tweak!(5.0) * data.dt.0, ); // If not on the ground while wielding glider enter gliding state diff --git a/common/systems/src/phys.rs b/common/systems/src/phys.rs index f1217f13ad..587d57a78f 100644 --- a/common/systems/src/phys.rs +++ b/common/systems/src/phys.rs @@ -54,25 +54,28 @@ fn integrate_glider_forces( _ => None, }?; - let dv_ = Some(dt.0 * glider.aerodynamic_forces(&rel_wind, AIR_DENSITY)) + let glider_rel_dv = Some(dt.0 * glider.aerodynamic_forces(&rel_wind, AIR_DENSITY)) .filter(|imp| !imp.is_approx_zero()) .map(|imp| imp / mass.0 - dv)?; - vel.0 += dv_; + vel.0 += glider_rel_dv; { - let glider_dir = ori.up(); + let char_up = ori.up(); let glider_dist = tweak!(1.0); - let glider_pos = *glider_dir * glider_dist; - if let Some(rot) = Dir::from_unnormalized(glider_pos + dv_) - .map(|u| { - let s = glider_dir.dot(*u).powf(tweak!(10.0) * dt.0); - glider_dir.slerped_to( - u, - tweak!(-0.7) + tweak!(1.0) * s.max(0.0) + tweak!(0.0) * s.min(0.0), - ) - }) - .map(|u| glider_dir.rotation_between(u)) + let glider_pos = *char_up * glider_dist; + + let glider_up = glider.ori.up(); + + let mut dr = glider_rel_dv; + // remove negative lift (for aesthetic reasons and because greater values of dv + // rotates too much) + let dn = glider_rel_dv.dot(*glider_up); + if dn.is_sign_negative() { + dr -= dn * *glider_up / glider_up.magnitude_squared() + } + if let Some(rot) = + Dir::from_unnormalized(glider_pos + dr).map(|u| char_up.rotation_between(u)) { *ori = ori.prerotated(rot); } diff --git a/voxygen/anim/src/character/glidewield.rs b/voxygen/anim/src/character/glidewield.rs index e142946b12..6adfd7ebe7 100644 --- a/voxygen/anim/src/character/glidewield.rs +++ b/voxygen/anim/src/character/glidewield.rs @@ -23,7 +23,8 @@ impl Animation for GlideWieldAnimation { s_a: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - let glider_ori = orientation.inverse() * glider_orientation; + let glider_ori = (orientation * next.torso.orientation * next.chest.orientation).inverse() + * glider_orientation; let glider_pos = Vec3::new(0.0, -5.0, 13.0); *rate = 1.0;