Further reduced steering angle at high speed to make the karts
easier to control at high speeds. Instead of using two speed and two different radii, now an arbitrary number of points (i.e. speed and radius at that speed) can be defined, stk will interpolate linearly between the points. The new settings leave the setting of 'normal' speed (i.e. without powerup) identical, only reduces the angle for higher speeds. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10058 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
d88c97b588
commit
e8b331de03
@ -185,14 +185,15 @@
|
|||||||
<swatter duration="10" distance="3" squash-duration="5"
|
<swatter duration="10" distance="3" squash-duration="5"
|
||||||
squash-slowdown="0.5"/>
|
squash-slowdown="0.5"/>
|
||||||
|
|
||||||
<!-- min-speed-radius and max-speed-radius define the smallest turn
|
<!-- turn-speed and turn-radius define the turn radius of the kart at
|
||||||
radius at lowest speed (4.64 m at speed 0) and at high speed
|
the given speed. The actual steering angle is dependent on the
|
||||||
(13.5 m at speed 12 m/s). Maximum steering angles for speeds
|
wheel base of the kart: radius = wheel_base/sin(steering_angle).
|
||||||
in between will be interpolated. This allows for tighter turns
|
The values below define that at speed 0 the turn radius is 3, at
|
||||||
at lower speeds. The actual steering angle is dependent on the
|
speed 10 (and up to 25 then) the radius is 15 etc.
|
||||||
wheel base of the kart: radius = wheel_base/sin(steering_angle)
|
The actual turn radius is piece-wise linearly interpolated. This
|
||||||
By specifying the radius the steering behaviour can be defined
|
allows for tighter turning at lower speeds, and also avoids that
|
||||||
independent of the kart size.
|
the kart becomes too hard to control at high speed (speeds of higher
|
||||||
|
than 23 can only be reached with powerups).
|
||||||
time-full-steer is the time when a player's input goes from neutral
|
time-full-steer is the time when a player's input goes from neutral
|
||||||
steering to extreme left or right.
|
steering to extreme left or right.
|
||||||
time-full-steer-ai is the time for the AI to go from neutral steering to
|
time-full-steer-ai is the time for the AI to go from neutral steering to
|
||||||
@ -203,7 +204,8 @@
|
|||||||
impossible). A value of 1/maxFPS / 2 will guarantee that
|
impossible). A value of 1/maxFPS / 2 will guarantee that
|
||||||
the wheel can go from -1 to +1 steering in one frame,
|
the wheel can go from -1 to +1 steering in one frame,
|
||||||
basically disabling this mechanism. -->
|
basically disabling this mechanism. -->
|
||||||
<turn min-speed-radius="0 3" max-speed-radius="10 15.0"
|
<turn turn-speed= "0 10 25 45"
|
||||||
|
turn-radius="3 15 15 25"
|
||||||
time-full-steer ="0.2" time-full-steer-ai="0.1" />
|
time-full-steer ="0.2" time-full-steer-ai="0.1" />
|
||||||
|
|
||||||
<!-- Speed and acceleration related values: power and max-speed (in m/s)
|
<!-- Speed and acceleration related values: power and max-speed (in m/s)
|
||||||
|
@ -55,14 +55,15 @@ KartProperties::KartProperties(const std::string &filename)
|
|||||||
m_shadow_y_offset = 0.0f;
|
m_shadow_y_offset = 0.0f;
|
||||||
|
|
||||||
m_groups.clear();
|
m_groups.clear();
|
||||||
|
m_turn_angle_at_speed.clear();
|
||||||
|
m_turn_speed.clear();
|
||||||
|
m_speed_angle_increase.clear();
|
||||||
m_custom_sfx_id.resize(SFXManager::NUM_CUSTOMS);
|
m_custom_sfx_id.resize(SFXManager::NUM_CUSTOMS);
|
||||||
|
|
||||||
// Set all other values to undefined, so that it can later be tested
|
// Set all other values to undefined, so that it can later be tested
|
||||||
// if everything is defined properly.
|
// if everything is defined properly.
|
||||||
m_mass = m_min_speed_turn = m_angle_at_min =
|
m_mass = m_brake_factor = m_engine_power[0] = m_engine_power[1] =
|
||||||
m_max_speed_turn = m_angle_at_max = m_brake_factor =
|
m_engine_power[2] = m_max_speed[0] = m_max_speed[1] = m_max_speed[2] =
|
||||||
m_engine_power[0] = m_engine_power[1] = m_engine_power[2] =
|
|
||||||
m_max_speed[0] = m_max_speed[1] = m_max_speed[2] =
|
|
||||||
m_time_full_steer = m_time_full_steer_ai =
|
m_time_full_steer = m_time_full_steer_ai =
|
||||||
m_nitro_power_boost = m_nitro_consumption =
|
m_nitro_power_boost = m_nitro_consumption =
|
||||||
m_nitro_small_container = m_nitro_big_container =
|
m_nitro_small_container = m_nitro_big_container =
|
||||||
@ -203,14 +204,19 @@ void KartProperties::load(const std::string &filename, const std::string &node)
|
|||||||
m_wheel_radius );
|
m_wheel_radius );
|
||||||
m_wheel_base = fabsf( m_kart_model->getWheelPhysicsPosition(0).getZ()
|
m_wheel_base = fabsf( m_kart_model->getWheelPhysicsPosition(0).getZ()
|
||||||
-m_kart_model->getWheelPhysicsPosition(2).getZ());
|
-m_kart_model->getWheelPhysicsPosition(2).getZ());
|
||||||
m_angle_at_min = asinf(m_wheel_base/m_min_radius);
|
for(unsigned int i=0; i<m_turn_angle_at_speed.size(); i++)
|
||||||
m_angle_at_max = asinf(m_wheel_base/m_max_radius);
|
{
|
||||||
if(m_max_speed_turn == m_min_speed_turn)
|
m_turn_angle_at_speed[i] = sin(m_wheel_base/m_turn_angle_at_speed[i]);
|
||||||
m_speed_angle_increase = 0.0;
|
}
|
||||||
|
for(unsigned int i=0; i<m_turn_speed.size()-1; i++)
|
||||||
|
{
|
||||||
|
if(m_turn_speed[i]==m_turn_speed[i+1])
|
||||||
|
m_speed_angle_increase.push_back(0);
|
||||||
else
|
else
|
||||||
m_speed_angle_increase = (m_angle_at_min - m_angle_at_max)
|
m_speed_angle_increase.push_back(
|
||||||
/ (m_max_speed_turn - m_min_speed_turn);
|
(m_turn_angle_at_speed[i]-m_turn_angle_at_speed[i+1])/
|
||||||
|
(m_turn_speed[i+1]-m_turn_speed[i]) );
|
||||||
|
}
|
||||||
|
|
||||||
m_shadow_texture = irr_driver->getTexture(m_shadow_file);
|
m_shadow_texture = irr_driver->getTexture(m_shadow_file);
|
||||||
file_manager->popTextureSearchPath();
|
file_manager->popTextureSearchPath();
|
||||||
@ -306,29 +312,30 @@ void KartProperties::getAllData(const XMLNode * root)
|
|||||||
{
|
{
|
||||||
turn_node->get("time-full-steer", &m_time_full_steer );
|
turn_node->get("time-full-steer", &m_time_full_steer );
|
||||||
turn_node->get("time-full-steer-ai", &m_time_full_steer_ai );
|
turn_node->get("time-full-steer-ai", &m_time_full_steer_ai );
|
||||||
std::vector<float> v;
|
turn_node->get("turn-speed", &m_turn_speed );
|
||||||
if(turn_node->get("min-speed-radius", &v))
|
turn_node->get("turn-radius", &m_turn_angle_at_speed);
|
||||||
|
// For now store the turn radius in turn angle, the correct
|
||||||
|
// value can only be determined later in ::load
|
||||||
|
if(m_turn_speed.size()==0 ||
|
||||||
|
m_turn_angle_at_speed.size() != m_turn_speed.size())
|
||||||
{
|
{
|
||||||
if(v.size()!=2)
|
printf("Inconsistent turn-speed and turn-radius "
|
||||||
printf("Incorrect min-speed-radius specifications for kart '%s'\n",
|
"settings for kart %s\n", getIdent().c_str());
|
||||||
getIdent().c_str());
|
exit(-1);
|
||||||
else
|
|
||||||
{
|
|
||||||
m_min_speed_turn = v[0];
|
|
||||||
m_min_radius = v[1];
|
|
||||||
}
|
}
|
||||||
|
for(unsigned int i=0; i<m_turn_speed.size()-1; i++)
|
||||||
|
{
|
||||||
|
if(m_turn_speed[i]>m_turn_speed[i+1])
|
||||||
|
{
|
||||||
|
printf("The turn-speed must be specified with increasing "
|
||||||
|
"values for kart %s.\n", getIdent().c_str());
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
if(m_turn_angle_at_speed[i]>m_turn_angle_at_speed[i+1])
|
||||||
v.clear();
|
|
||||||
if(turn_node->get("max-speed-radius", &v))
|
|
||||||
{
|
{
|
||||||
if(v.size()!=2)
|
printf("The turn-angle must be increasing for kart %s.\n",
|
||||||
printf("Incorrect max-speed-radius specifications for kart '%s'\n",
|
|
||||||
getIdent().c_str());
|
getIdent().c_str());
|
||||||
else
|
exit(-1);
|
||||||
{
|
|
||||||
m_max_speed_turn = v[0];
|
|
||||||
m_max_radius = v[1];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // if turn_node
|
} // if turn_node
|
||||||
@ -553,10 +560,6 @@ void KartProperties::checkAllSet(const std::string &filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CHECK_NEG(m_mass, "mass" );
|
CHECK_NEG(m_mass, "mass" );
|
||||||
CHECK_NEG(m_min_speed_turn, "turn min-speed-angle" );
|
|
||||||
CHECK_NEG(m_min_radius, "turn min-speed-angle" );
|
|
||||||
CHECK_NEG(m_max_speed_turn, "turn max-speed-angle" );
|
|
||||||
CHECK_NEG(m_max_radius, "turn max-speed-angle" );
|
|
||||||
CHECK_NEG(m_time_full_steer, "turn time-full-steer" );
|
CHECK_NEG(m_time_full_steer, "turn time-full-steer" );
|
||||||
CHECK_NEG(m_time_full_steer_ai, "turn time-full-steer-ai" );
|
CHECK_NEG(m_time_full_steer_ai, "turn time-full-steer-ai" );
|
||||||
CHECK_NEG(m_wheel_damping_relaxation, "wheels damping-relaxation" );
|
CHECK_NEG(m_wheel_damping_relaxation, "wheels damping-relaxation" );
|
||||||
@ -638,9 +641,22 @@ void KartProperties::checkAllSet(const std::string &filename)
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
float KartProperties::getMaxSteerAngle(float speed) const
|
float KartProperties::getMaxSteerAngle(float speed) const
|
||||||
{
|
{
|
||||||
if(speed<=m_min_speed_turn) return m_angle_at_min;
|
if(speed<=m_turn_speed[0]) return m_turn_angle_at_speed[0];
|
||||||
if(speed>=m_max_speed_turn) return m_angle_at_max;
|
unsigned int last = m_turn_speed.size()-1;
|
||||||
return m_angle_at_min - (speed-m_min_speed_turn)*m_speed_angle_increase;
|
if(speed>=m_turn_speed[last]) return m_turn_angle_at_speed[last];
|
||||||
|
|
||||||
|
for(unsigned int i=1; i<=last; i++)
|
||||||
|
{
|
||||||
|
if(speed <= m_turn_speed[i])
|
||||||
|
{
|
||||||
|
// Interpolate between i and i+1
|
||||||
|
return m_turn_angle_at_speed[i] -
|
||||||
|
(speed-m_turn_speed[i])*m_speed_angle_increase[i-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// This should never be reached
|
||||||
|
assert (0);
|
||||||
|
return 0; // avoid compiler warning
|
||||||
} // getMaxSteerAngle
|
} // getMaxSteerAngle
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -76,9 +76,6 @@ private:
|
|||||||
std::vector<std::string> m_groups;
|
std::vector<std::string> m_groups;
|
||||||
static float UNDEFINED;
|
static float UNDEFINED;
|
||||||
|
|
||||||
/** Increase of turn angle with speed. */
|
|
||||||
float m_speed_angle_increase;
|
|
||||||
|
|
||||||
/** Version of the .kart file. */
|
/** Version of the .kart file. */
|
||||||
int m_version;
|
int m_version;
|
||||||
|
|
||||||
@ -120,16 +117,16 @@ private:
|
|||||||
float m_time_full_steer_ai; /**< Time for AI karts to reach full
|
float m_time_full_steer_ai; /**< Time for AI karts to reach full
|
||||||
* steer angle (used to reduce shaking
|
* steer angle (used to reduce shaking
|
||||||
* of karts). */
|
* of karts). */
|
||||||
float m_min_speed_turn, /**< Speed for smallest turn radius. */
|
/** Stores the speeds at which the turn angle changes. */
|
||||||
m_angle_at_min, /**< Steering angle for minimal turn
|
std::vector<float> m_turn_speed;
|
||||||
radius. Computed from radius and
|
|
||||||
kart length. */
|
/** Stores the turn angle at the corresponding turn speed. */
|
||||||
m_min_radius; /**< Smallest turn radius. */
|
std::vector<float> m_turn_angle_at_speed;
|
||||||
float m_max_speed_turn, /**< Speed for largest turn radius. */
|
|
||||||
m_angle_at_max, /**< Steering angle for maximum turn
|
/** Increase of turn angle with speed. */
|
||||||
radius. Computed from radius and
|
std::vector<float> m_speed_angle_increase;
|
||||||
kart length. */
|
|
||||||
m_max_radius; /**< Largest turn radius. */
|
|
||||||
|
|
||||||
/** Time a kart is moved upwards after when it is rescued. */
|
/** Time a kart is moved upwards after when it is rescued. */
|
||||||
float m_rescue_time;
|
float m_rescue_time;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user