As a response to issue [#28483] "Enable/Disable Rigid Body actuator do nothing" reported by Jean-Francois Gallant (pyroevil), I'm adding preliminary support to enable and disable rigid body physics on dynamic objects. This is can be done via the Edit Object Actuator or through KX_GameObject.enableRigidBody() and KX_GameObject.disableRigidBody(). Thanks to Sergej Reich for his help with the patch.
This commit is contained in:
@@ -1335,18 +1335,10 @@ Game Types (bge.types)
|
|||||||
|
|
||||||
Rigid body physics allows the object to roll on collisions.
|
Rigid body physics allows the object to roll on collisions.
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
This is not working with bullet physics yet.
|
|
||||||
|
|
||||||
.. method:: disableRigidBody()
|
.. method:: disableRigidBody()
|
||||||
|
|
||||||
Disables rigid body physics for this object.
|
Disables rigid body physics for this object.
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
This is not working with bullet physics yet. The angular is removed but rigid body physics can still rotate it later.
|
|
||||||
|
|
||||||
.. method:: setParent(parent, compound=True, ghost=True)
|
.. method:: setParent(parent, compound=True, ghost=True)
|
||||||
|
|
||||||
Sets this object's parent.
|
Sets this object's parent.
|
||||||
|
@@ -232,6 +232,7 @@ MT_Vector3 KX_BulletPhysicsController::getReactionForce()
|
|||||||
}
|
}
|
||||||
void KX_BulletPhysicsController::setRigidBody(bool rigid)
|
void KX_BulletPhysicsController::setRigidBody(bool rigid)
|
||||||
{
|
{
|
||||||
|
CcdPhysicsController::setRigidBody(rigid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function dynamically adds the collision shape of another controller to
|
/* This function dynamically adds the collision shape of another controller to
|
||||||
|
@@ -118,6 +118,12 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
|
|||||||
|
|
||||||
ci.m_MotionState = motionstate;
|
ci.m_MotionState = motionstate;
|
||||||
ci.m_gravity = btVector3(0,0,0);
|
ci.m_gravity = btVector3(0,0,0);
|
||||||
|
ci.m_linearFactor = btVector3(objprop->m_lockXaxis? 0 : 1,
|
||||||
|
objprop->m_lockYaxis? 0 : 1,
|
||||||
|
objprop->m_lockZaxis? 0 : 1);
|
||||||
|
ci.m_angularFactor = btVector3(objprop->m_lockXRotaxis? 0 : 1,
|
||||||
|
objprop->m_lockYRotaxis? 0 : 1,
|
||||||
|
objprop->m_lockZRotaxis? 0 : 1);
|
||||||
ci.m_localInertiaTensor =btVector3(0,0,0);
|
ci.m_localInertiaTensor =btVector3(0,0,0);
|
||||||
ci.m_mass = objprop->m_dyna ? shapeprops->m_mass : 0.f;
|
ci.m_mass = objprop->m_dyna ? shapeprops->m_mass : 0.f;
|
||||||
ci.m_clamp_vel_min = shapeprops->m_clamp_vel_min;
|
ci.m_clamp_vel_min = shapeprops->m_clamp_vel_min;
|
||||||
@@ -441,16 +447,8 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
|
|||||||
{
|
{
|
||||||
if (objprop->m_angular_rigidbody)
|
if (objprop->m_angular_rigidbody)
|
||||||
{
|
{
|
||||||
btVector3 linearFactor(
|
rbody->setLinearFactor(ci.m_linearFactor);
|
||||||
objprop->m_lockXaxis? 0 : 1,
|
rbody->setAngularFactor(ci.m_angularFactor);
|
||||||
objprop->m_lockYaxis? 0 : 1,
|
|
||||||
objprop->m_lockZaxis? 0 : 1);
|
|
||||||
btVector3 angularFactor(
|
|
||||||
objprop->m_lockXRotaxis? 0 : 1,
|
|
||||||
objprop->m_lockYRotaxis? 0 : 1,
|
|
||||||
objprop->m_lockZRotaxis? 0 : 1);
|
|
||||||
rbody->setLinearFactor(linearFactor);
|
|
||||||
rbody->setAngularFactor(angularFactor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rbody && objprop->m_disableSleeping)
|
if (rbody && objprop->m_disableSleeping)
|
||||||
|
@@ -1294,17 +1294,16 @@ void CcdPhysicsController::getReactionForce(float& forceX,float& forceY,float&
|
|||||||
// dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted
|
// dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted
|
||||||
void CcdPhysicsController::setRigidBody(bool rigid)
|
void CcdPhysicsController::setRigidBody(bool rigid)
|
||||||
{
|
{
|
||||||
if (!rigid)
|
btRigidBody* body = GetRigidBody();
|
||||||
|
if (body)
|
||||||
{
|
{
|
||||||
btRigidBody* body = GetRigidBody();
|
m_cci.m_bRigid = rigid;
|
||||||
if (body)
|
if (!rigid) {
|
||||||
{
|
body->setAngularFactor(0.f);
|
||||||
//fake it for now
|
body->setAngularVelocity(btVector3(0.f, 0.f, 0.f));
|
||||||
btVector3 inertia = body->getInvInertiaDiagLocal();
|
|
||||||
inertia[1] = 0.f;
|
|
||||||
body->setInvInertiaDiagLocal(inertia);
|
|
||||||
body->updateInertiaTensor();
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
body->setAngularFactor(m_cci.m_angularFactor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -229,6 +229,8 @@ struct CcdConstructionInfo
|
|||||||
:m_localInertiaTensor(1.f, 1.f, 1.f),
|
:m_localInertiaTensor(1.f, 1.f, 1.f),
|
||||||
m_gravity(0,0,0),
|
m_gravity(0,0,0),
|
||||||
m_scaling(1.f,1.f,1.f),
|
m_scaling(1.f,1.f,1.f),
|
||||||
|
m_linearFactor(0.f, 0.f, 0.f),
|
||||||
|
m_angularFactor(0.f, 0.f, 0.f),
|
||||||
m_mass(0.f),
|
m_mass(0.f),
|
||||||
m_clamp_vel_min(-1.f),
|
m_clamp_vel_min(-1.f),
|
||||||
m_clamp_vel_max(-1.f),
|
m_clamp_vel_max(-1.f),
|
||||||
@@ -292,6 +294,8 @@ struct CcdConstructionInfo
|
|||||||
btVector3 m_localInertiaTensor;
|
btVector3 m_localInertiaTensor;
|
||||||
btVector3 m_gravity;
|
btVector3 m_gravity;
|
||||||
btVector3 m_scaling;
|
btVector3 m_scaling;
|
||||||
|
btVector3 m_linearFactor;
|
||||||
|
btVector3 m_angularFactor;
|
||||||
btScalar m_mass;
|
btScalar m_mass;
|
||||||
btScalar m_clamp_vel_min;
|
btScalar m_clamp_vel_min;
|
||||||
btScalar m_clamp_vel_max;
|
btScalar m_clamp_vel_max;
|
||||||
|
Reference in New Issue
Block a user