diff options
5 files changed, 29 insertions, 9 deletions
diff --git a/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst b/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst index b314a47c8e9..215ff40577c 100644 --- a/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst +++ b/doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst @@ -551,7 +551,7 @@ base class --- :class:`SCA_IObject` This is not implimented at the moment. - .. method:: applyImpulse(point, impulse) + .. method:: applyImpulse(point, impulse, local=False) Applies an impulse to the game object. @@ -559,8 +559,14 @@ base class --- :class:`SCA_IObject` If point != position, applyImpulse will also change the object's angular momentum. Otherwise, only linear momentum will change. - :arg point: the point to apply the impulse to (in world coordinates) - :type point: the point to apply the impulse to (in world coordinates) + :arg point: the point to apply the impulse to (in world or local coordinates) + :type point: point [ix, iy, iz] the point to apply the impulse to (in world or local coordinates) + :arg impulse: impulse vector. + :type impulse: 3D Vector + :arg local: + * False: you get the "global" impulse ie: relative to world coordinates with world orientation. + * True: you get the "local" impulse ie: relative to local coordinates with object orientation. + :type local: boolean .. method:: suspendDynamics() diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 44646f17a6e..f61d08e7f71 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -3034,19 +3034,20 @@ PyObject *KX_GameObject::PyApplyImpulse(PyObject *args) { PyObject *pyattach; PyObject *pyimpulse; + int local = 0; if (!m_pPhysicsController) { PyErr_SetString(PyExc_RuntimeError, "This object has no physics controller"); return NULL; } - if (PyArg_ParseTuple(args, "OO:applyImpulse", &pyattach, &pyimpulse)) + if (PyArg_ParseTuple(args, "OO|i:applyImpulse", &pyattach, &pyimpulse, &local)) { MT_Point3 attach; MT_Vector3 impulse; if (PyVecTo(pyattach, attach) && PyVecTo(pyimpulse, impulse)) { - m_pPhysicsController->ApplyImpulse(attach, impulse); + m_pPhysicsController->ApplyImpulse(attach, impulse, (local!=0)); Py_RETURN_NONE; } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index c98cf212265..72c3b13e301 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -1309,8 +1309,9 @@ void CcdPhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool loc } } } -void CcdPhysicsController::ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulsein) +void CcdPhysicsController::ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulsein, bool local) { + btVector3 pos; btVector3 impulse(impulsein.x(), impulsein.y(), impulsein.z()); if (m_object && impulse.length2() > (SIMD_EPSILON*SIMD_EPSILON)) @@ -1323,7 +1324,19 @@ void CcdPhysicsController::ApplyImpulse(const MT_Point3& attach, const MT_Vecto return; } - btVector3 pos(attach.x(), attach.y(), attach.z()); + btTransform xform = m_object->getWorldTransform(); + + if (local) + { + pos = btVector3(attach.x(), attach.y(), attach.z()); + impulse = xform.getBasis() * impulse; + } + else { + /* If the point of impulse application is not equal to the object position + * then an angular momentum is generated in the object*/ + pos = btVector3(attach.x()-xform.getOrigin().x(), attach.y()-xform.getOrigin().y(), attach.z()-xform.getOrigin().z()); + } + btRigidBody* body = GetRigidBody(); if (body) body->applyImpulse(impulse,pos); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 25a8f0306bd..4d0d96e07c6 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -565,7 +565,7 @@ protected: virtual void SetMass(MT_Scalar newmass); // physics methods - virtual void ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulsein); + virtual void ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulsein, bool local); virtual void ApplyTorque(const MT_Vector3& torque,bool local); virtual void ApplyForce(const MT_Vector3& force,bool local); virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local); diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index 2ffb115e3b2..f9975484fa7 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -82,7 +82,7 @@ class PHY_IPhysicsController : public PHY_IController virtual void SetMass(MT_Scalar newmass)=0; // physics methods - virtual void ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulse)=0; + virtual void ApplyImpulse(const MT_Point3& attach, const MT_Vector3& impulse,bool local)=0; virtual void ApplyTorque(const MT_Vector3& torque,bool local)=0; virtual void ApplyForce(const MT_Vector3& force,bool local)=0; virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local)=0; |