mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Prevent rotation from negative lift and fix glider ori in wield state
This commit is contained in:
parent
798f4b76b0
commit
c53a711a91
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user