Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst12
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp5
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp17
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h2
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;