Imrpoved skidding: getting out of skid reset the visual rotation

exponentially, so it was not in sync with the physical rotation.
Getting out of skid should now be smother.


git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11703 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk
2012-10-17 21:51:10 +00:00
parent 4a8a40c7e8
commit 90d6f45a3a
2 changed files with 21 additions and 15 deletions

View File

@@ -81,7 +81,7 @@ void Skidding::reset()
* kart skids either left or right, the steering fraction is bound by
* reduce-turn-min and reduce-turn-max.
*/
void Skidding::updateSteering(float steer)
void Skidding::updateSteering(float steer, float dt)
{
if(m_skid_state==SKID_OLD)
{
@@ -101,13 +101,21 @@ void Skidding::updateSteering(float steer)
case SKID_SHOW_GFX_RIGHT:
case SKID_NONE:
m_real_steering = steer;
if(m_skid_time<m_skid_visual_time && m_skid_time>0)
{
m_visual_rotation -= m_visual_rotation*dt/m_skid_time;
}
break;
case SKID_ACCUMULATE_RIGHT:
{
float f = (1.0f+steer)*0.5f; // map [-1,1] --> [0, 1]
m_real_steering = m_skid_reduce_turn_min+
m_skid_reduce_turn_delta*f;
m_visual_rotation = m_skid_visual * m_real_steering;
if(m_skid_time < m_skid_visual_time)
m_visual_rotation = m_skid_visual*m_real_steering*m_skid_time
/ m_skid_visual_time;
else
m_visual_rotation = m_skid_visual * m_real_steering;
break;
}
case SKID_ACCUMULATE_LEFT:
@@ -115,14 +123,15 @@ void Skidding::updateSteering(float steer)
float f = (-1.0f+steer)*0.5f; // map [-1,1] --> [-1, 0]
m_real_steering = -m_skid_reduce_turn_min+
m_skid_reduce_turn_delta*f;
m_visual_rotation = m_skid_visual * m_real_steering;
if(m_skid_time < m_skid_visual_time)
m_visual_rotation = m_skid_visual*m_real_steering*m_skid_time
/ m_skid_visual_time;
else
m_visual_rotation = m_skid_visual * m_real_steering;
break;
}
} // switch m_skid_state
float st = fabsf(m_skid_time);
if(st<m_skid_visual_time)
m_visual_rotation *= st/m_skid_visual_time;
} // updateSteering
// ----------------------------------------------------------------------------
@@ -205,7 +214,7 @@ void Skidding::update(float dt, bool is_on_ground,
// FIXME hiker: remove once the new skidding code is finished.
if(m_skid_state == SKID_OLD)
{
updateSteering(steering);
updateSteering(steering, dt);
return;
}
@@ -271,7 +280,7 @@ void Skidding::update(float dt, bool is_on_ground,
#ifdef SKID_DEBUG
#define SPEED 20.0f
updateSteering(steering);
updateSteering(steering, dt);
m_actual_curve->clear();
m_actual_curve->setVisible(true);
m_predicted_curve->clear();
@@ -343,11 +352,8 @@ void Skidding::update(float dt, bool is_on_ground,
m_skid_state = m_skid_state == SKID_ACCUMULATE_LEFT
? SKID_SHOW_GFX_LEFT
: SKID_SHOW_GFX_RIGHT;
float t = (m_skid_time <= m_skid_visual_time)
? m_skid_time
: m_skid_visual_time;
if(t>m_skid_revert_visual_time)
t = m_skid_revert_visual_time;
float t = std::min(m_skid_time, m_skid_visual_time);
t = std::min(t, m_skid_revert_visual_time);
float vso = getVisualSkidRotation();
btVector3 rot(0, vso*m_post_skid_rotate_factor, 0);
@@ -381,7 +387,7 @@ void Skidding::update(float dt, bool is_on_ground,
m_skid_state = SKID_NONE;
}
} // switch
updateSteering(steering);
updateSteering(steering, dt);
} // update
// ----------------------------------------------------------------------------

View File

@@ -100,7 +100,7 @@ private:
unsigned int getSkidBonus(float *bonus_time, float *bonus_speed,
float *bonus_force) const;
void updateSteering(float steer);
void updateSteering(float steer, float dt);
public:
Skidding(Kart *kart, const SkiddingProperties *sp);
~Skidding();