[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20665] trunk/blender: #18872 bugfix for torque on dynamic objects

Erwin Coumans blender at erwincoumans.com
Sat Jun 6 02:12:49 CEST 2009


Revision: 20665
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20665
Author:   erwin
Date:     2009-06-06 02:12:49 +0200 (Sat, 06 Jun 2009)

Log Message:
-----------
#18872 bugfix for torque on dynamic objects
#18893, fix to getParam for generic 6dof constraints

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
    trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h

Modified: trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp	2009-06-06 00:12:49 UTC (rev 20665)
@@ -663,10 +663,15 @@
 }
 
 
+btScalar	btGeneric6DofConstraint::getRelativePivotPosition(int axisIndex) const
+{
+	return m_calculatedLinearDiff[axisIndex];
+}
 
-btScalar btGeneric6DofConstraint::getAngle(int axis_index) const
+
+btScalar btGeneric6DofConstraint::getAngle(int axisIndex) const
 {
-	return m_calculatedAxisAngleDiff[axis_index];
+	return m_calculatedAxisAngleDiff[axisIndex];
 }
 
 
@@ -839,7 +844,6 @@
 
 
 
-
 btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
 	: btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
 {
@@ -848,6 +852,7 @@
 		m_springEnabled[i] = false;
 		m_equilibriumPoint[i] = btScalar(0.f);
 		m_springStiffness[i] = btScalar(0.f);
+		m_springDamping[i] = btScalar(1.f);
 	}
 }
 
@@ -875,6 +880,13 @@
 }
 
 
+void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping)
+{
+	btAssert((index >= 0) && (index < 6));
+	m_springDamping[index] = damping;
+}
+
+
 void btGeneric6DofSpringConstraint::setEquilibriumPoint()
 {
 	calculateTransforms();
@@ -908,6 +920,7 @@
 
 void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info)
 {
+	calculateTransforms();
 	// it is assumed that calculateTransforms() have been called before this call
 	int i;
 	btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity();
@@ -921,8 +934,9 @@
 			btScalar delta = currPos - m_equilibriumPoint[i];
 			// spring force is (delta * m_stiffness) according to Hooke's Law
 			btScalar force = delta * m_springStiffness[i];
-			m_linearLimits.m_targetVelocity[i] = force  * info->fps;
-			m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps;
+			btScalar velFactor = info->fps * m_springDamping[i];
+			m_linearLimits.m_targetVelocity[i] =  velFactor * force;
+			m_linearLimits.m_maxMotorForce[i] =  btFabs(force) / info->fps;
 		}
 	}
 	for(i = 0; i < 3; i++)
@@ -935,7 +949,8 @@
 			btScalar delta = currPos - m_equilibriumPoint[i+3];
 			// spring force is (-delta * m_stiffness) according to Hooke's Law
 			btScalar force = -delta * m_springStiffness[i+3];
-			m_angularLimits[i].m_targetVelocity = force  * info->fps;
+			btScalar velFactor = info->fps * m_springDamping[i+3];
+			m_angularLimits[i].m_targetVelocity = velFactor * force;
 			m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps;
 		}
 	}

Modified: trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h	2009-06-06 00:12:49 UTC (rev 20665)
@@ -382,14 +382,21 @@
 
     //! Get the relative Euler angle
     /*!
-	\pre btGeneric6DofConstraint.buildJacobian must be called previously.
+	\pre btGeneric6DofConstraint::calculateTransforms() must be called previously.
 	*/
     btScalar getAngle(int axis_index) const;
 
+	//! Get the relative position of the constraint pivot
+    /*!
+	\pre btGeneric6DofConstraint::calculateTransforms() must be called previously.
+	*/
+	btScalar getRelativePivotPosition(int axis_index) const;
+
+
 	//! Test angular limit.
 	/*!
 	Calculates angular correction and returns true if limit needs to be corrected.
-	\pre btGeneric6DofConstraint.buildJacobian must be called previously.
+	\pre btGeneric6DofConstraint::calculateTransforms() must be called previously.
 	*/
     bool testAngularLimitMotor(int axis_index);
 
@@ -496,11 +503,13 @@
 	bool		m_springEnabled[6];
 	btScalar	m_equilibriumPoint[6];
 	btScalar	m_springStiffness[6];
+	btScalar	m_springDamping[6]; // between 0 and 1 (1 == no damping)
 	void internalUpdateSprings(btConstraintInfo2* info);
 public: 
     btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
 	void enableSpring(int index, bool onOff);
 	void setStiffness(int index, btScalar stiffness);
+	void setDamping(int index, btScalar damping);
 	void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF
 	void setEquilibriumPoint(int index);  // set the current constraint position/orientation as an equilibrium point for given DOF
 	virtual void getInfo2 (btConstraintInfo2* info);

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp	2009-06-06 00:12:49 UTC (rev 20665)
@@ -54,6 +54,20 @@
 	return PyInt_FromLong(m_constraintId);
 }
 
+
+PyObject* KX_ConstraintWrapper::PyGetParam(PyObject* args, PyObject* kwds)
+{
+	int dof;
+	float value;
+	
+	if (!PyArg_ParseTuple(args,"i:getParam",&dof))
+		return NULL;
+	
+	value = m_physenv->getConstraintParam(m_constraintId,dof);
+	return PyFloat_FromDouble(value);
+	
+}
+
 PyObject* KX_ConstraintWrapper::PySetParam(PyObject* args, PyObject* kwds)
 {
 	int dof;
@@ -119,6 +133,7 @@
 PyMethodDef KX_ConstraintWrapper::Methods[] = {
 	{"getConstraintId",(PyCFunction) KX_ConstraintWrapper::sPyGetConstraintId, METH_NOARGS},
 	{"setParam",(PyCFunction) KX_ConstraintWrapper::sPySetParam, METH_VARARGS},
+	{"getParam",(PyCFunction) KX_ConstraintWrapper::sPyGetParam, METH_VARARGS},
 	{NULL,NULL} //Sentinel
 };
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h	2009-06-06 00:12:49 UTC (rev 20665)
@@ -45,6 +45,7 @@
 	
 	KX_PYMETHOD_NOARGS(KX_ConstraintWrapper,GetConstraintId);
 	KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
+	KX_PYMETHOD(KX_ConstraintWrapper,GetParam);
 
 private:
 	int					m_constraintId;

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-06-06 00:12:49 UTC (rev 20665)
@@ -1019,7 +1019,8 @@
 			//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
 			//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
 			const btVector3& angFac = body->getAngularFactor();
-			body->setAngularFactor(1.f);
+			btVector3 tmpFac(0,0,1);
+			body->setAngularFactor(tmpFac);
 			body->applyTorque(torque);
 			body->setAngularFactor(angFac);
 		}

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp	2009-06-06 00:12:49 UTC (rev 20665)
@@ -1786,6 +1786,45 @@
 }
 
 
+float	CcdPhysicsEnvironment::getConstraintParam(int constraintId,int param)
+{
+	btTypedConstraint* typedConstraint = getConstraintById(constraintId);
+	switch (typedConstraint->getUserConstraintType())
+	{
+	case PHY_GENERIC_6DOF_CONSTRAINT:
+		{
+			
+			switch (param)
+			{
+			case 0:	case 1: case 2: 
+				{
+					//param = 0..2 are linear constraint values
+					btGeneric6DofConstraint* genCons = (btGeneric6DofConstraint*)typedConstraint;
+					genCons->calculateTransforms();
+					return genCons->getRelativePivotPosition(param);
+					break;
+				}
+				case 3: case 4: case 5:
+				{
+					//param = 3..5 are relative constraint (Euler) angles
+					btGeneric6DofConstraint* genCons = (btGeneric6DofConstraint*)typedConstraint;
+					genCons->calculateTransforms();
+					return genCons->getAngle(param-3);
+					break;
+				}
+			default:
+				{
+				}
+			}
+			break;
+		};
+	default:
+		{
+		};
+	};
+	return 0.f;
+}
+
 void	CcdPhysicsEnvironment::setConstraintParam(int constraintId,int param,float value0,float value1)
 {
 	btTypedConstraint* typedConstraint = getConstraintById(constraintId);
@@ -1835,11 +1874,9 @@
 					{
 						bool springEnabled = true;
 						genCons->setStiffness(springIndex,value0);
+						genCons->setDamping(springIndex,value1);
 						genCons->enableSpring(springIndex,springEnabled);
-						if (value1>0.5f)
-						{
-							genCons->setEquilibriumPoint(springIndex);
-						}
+						genCons->setEquilibriumPoint(springIndex);
 					} else
 					{
 						bool springEnabled = false;

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h	2009-06-06 00:12:49 UTC (rev 20665)
@@ -149,7 +149,10 @@
 			const btVector3& angularMaxLimits,int flags
 			);
 
+		
 		virtual void	setConstraintParam(int constraintId,int param,float value,float value1);
+		
+		virtual float	getConstraintParam(int constraintId,int param);
 
 	    virtual void		removeConstraint(int	constraintid);
 

Modified: trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h	2009-06-05 23:59:33 UTC (rev 20664)
+++ trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h	2009-06-06 00:12:49 UTC (rev 20665)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list