Added support for bevelled collision shapes using

a convex hull collision shape. Disabled by default,
set bevel-factor in stk-config (e.g. to 0.3 0.3 0.3).


git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10466 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2011-12-21 21:08:48 +00:00
parent 2f89789c56
commit 13bca2e3d4
4 changed files with 60 additions and 9 deletions

View File

@ -291,9 +291,17 @@
problem that the amount of push a hit kart receives depends on problem that the amount of push a hit kart receives depends on
the orientation - if a kart is pushed in the direction it is the orientation - if a kart is pushed in the direction it is
driving, it will be more (no friction from tires), while when driving, it will be more (no friction from tires), while when
pushed to the side, hardly anything happens. --> pushed to the side, hardly anything happens.
<collision impulse="300" impulse-time="0.2" side-impulse="900" bevel-factor: the X and Y coordinate of each point of the kart
restitution="0.5"/> chassis (box) are multiplied with (1-bevelX) and (1-bevelY),
and the Z coordinate is multiplied with (1+bevelZ). The
resulting point is then added to the chassis collision shape.
This gives a bevelled box shape. A value of 0 for all bevel
coordinates disables bevelling, and uses a simple box shape.
As an example, a value of 1 for x and z will result in a
sharp 'arrow' like shape. -->
<collision impulse="150" impulse-time="0.1" side-impulse="600"
restitution="1.0" bevel-factor="0 0 0" />
<!-- Kart-specific plunger and rubber band handling: max-length is <!-- Kart-specific plunger and rubber band handling: max-length is
the maximum length of rubber band before it snaps. force is the maximum length of rubber band before it snaps. force is

View File

@ -242,10 +242,43 @@ void Kart::createPhysics()
{ {
kart_height = kart_length*0.6f; kart_height = kart_length*0.6f;
} }
btBoxShape *shape = new btBoxShape(btVector3(0.5f*kart_width, btCollisionShape *shape;
0.5f*kart_height, const Vec3 &bevel = m_kart_properties->getBevelFactor();
0.5f*kart_length)); if(bevel.getX() || bevel.getY() || bevel.getZ())
{
Vec3 bevel_factor(1.0f-bevel.getX(),
1.0f-bevel.getY(),
1.0f+bevel.getZ() );
btConvexHullShape *hull = new btConvexHullShape();
for(int x=-1; x<=1; x+=2)
{
for(int y=-1; y<=1; y+=2)
{
for(int z=-1; z<=1; z+=2)
{
btVector3 p(x*getKartModel()->getWidth() *0.5f,
y*getKartModel()->getHeight()*0.5f,
z*getKartModel()->getLength()*0.5f);
hull->addPoint(p);
p *= bevel_factor;
hull->addPoint(p);
} // for z
} // for y
} // for x
// This especially enables proper drawing of the point cloud
hull->initializePolyhedralFeatures();
shape = hull;
} // bevel.getX()!=0
else
{
shape = new btBoxShape(btVector3(0.5f*kart_width,
0.5f*kart_height,
0.5f*kart_length));
}
btTransform shiftCenterOfGravity; btTransform shiftCenterOfGravity;
shiftCenterOfGravity.setIdentity(); shiftCenterOfGravity.setIdentity();
// Shift center of gravity downwards, so that the kart // Shift center of gravity downwards, so that the kart

View File

@ -98,6 +98,7 @@ KartProperties::KartProperties(const std::string &filename)
m_squash_duration = m_downward_impulse_factor = UNDEFINED; m_squash_duration = m_downward_impulse_factor = UNDEFINED;
m_gravity_center_shift = Vec3(UNDEFINED); m_gravity_center_shift = Vec3(UNDEFINED);
m_bevel_factor = Vec3(UNDEFINED);
m_exp_spring_response = false; m_exp_spring_response = false;
m_has_skidmarks = true; m_has_skidmarks = true;
m_version = 0; m_version = 0;
@ -432,6 +433,7 @@ void KartProperties::getAllData(const XMLNode * root)
collision_node->get("impulse-time", &m_collision_impulse_time); collision_node->get("impulse-time", &m_collision_impulse_time);
collision_node->get("side-impulse", &m_collision_side_impulse); collision_node->get("side-impulse", &m_collision_side_impulse);
collision_node->get("restitution", &m_restitution ); collision_node->get("restitution", &m_restitution );
collision_node->get("bevel-factor", &m_bevel_factor );
} }
//TODO: wheel front right and wheel front left is not loaded, yet is listed as an attribute in the xml file after wheel-radius //TODO: wheel front right and wheel front left is not loaded, yet is listed as an attribute in the xml file after wheel-radius
@ -600,6 +602,9 @@ void KartProperties::checkAllSet(const std::string &filename)
CHECK_NEG(m_collision_impulse_time, "collision impulse-time" ); CHECK_NEG(m_collision_impulse_time, "collision impulse-time" );
CHECK_NEG(m_restitution, "collision restitution" ); CHECK_NEG(m_restitution, "collision restitution" );
CHECK_NEG(m_collision_side_impulse, "collision side-impulse" ); CHECK_NEG(m_collision_side_impulse, "collision side-impulse" );
CHECK_NEG(m_bevel_factor.getX(), "collision bevel-factor" );
CHECK_NEG(m_bevel_factor.getY(), "collision bevel-factor" );
CHECK_NEG(m_bevel_factor.getZ(), "collision bevel-factor" );
CHECK_NEG(m_upright_tolerance, "upright tolerance" ); CHECK_NEG(m_upright_tolerance, "upright tolerance" );
CHECK_NEG(m_upright_max_force, "upright max-force" ); CHECK_NEG(m_upright_max_force, "upright max-force" );
CHECK_NEG(m_plunger_in_face_duration[0],"plunger in-face-time[0]" ); CHECK_NEG(m_plunger_in_face_duration[0],"plunger in-face-time[0]" );

View File

@ -125,7 +125,9 @@ private:
/** Increase of turn angle with speed. */ /** Increase of turn angle with speed. */
std::vector<float> m_speed_angle_increase; std::vector<float> m_speed_angle_increase;
/** If != 0 a bevelled box shape is used by using a point cloud as a
* collision shape. */
Vec3 m_bevel_factor;
/** 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;
@ -181,7 +183,7 @@ private:
float m_wheel_base; float m_wheel_base;
/** Nitro power boost. */ /** Nitro power boost. */
float m_nitro_power_boost; float m_nitro_power_boost;
/**< Nitro consumption. */ /** Nitro consumption. */
float m_nitro_consumption; float m_nitro_consumption;
/** Nitro amount for small bottle. */ /** Nitro amount for small bottle. */
float m_nitro_small_container; float m_nitro_small_container;
@ -693,6 +695,9 @@ public:
float getSquashSlowdown() const {return m_squash_slowdown; } float getSquashSlowdown() const {return m_squash_slowdown; }
bool hasRandomWheels() const { return m_has_rand_wheels; } bool hasRandomWheels() const { return m_has_rand_wheels; }
/** Returns the bevel factor (!=0 indicates to use a bevelled box). */
const Vec3 &getBevelFactor() const { return m_bevel_factor; }
}; // KartProperties }; // KartProperties
#endif #endif