forked from bartvdbraak/blender
#18872 bugfix for torque on dynamic objects
#18893, fix to getParam for generic 6dof constraints
This commit is contained in:
parent
04ccb0caf8
commit
884a6a6573
@ -663,10 +663,15 @@ btVector3 btGeneric6DofConstraint::getAxis(int axis_index) const
|
||||
}
|
||||
|
||||
|
||||
|
||||
btScalar btGeneric6DofConstraint::getAngle(int axis_index) const
|
||||
btScalar btGeneric6DofConstraint::getRelativePivotPosition(int axisIndex) const
|
||||
{
|
||||
return m_calculatedAxisAngleDiff[axis_index];
|
||||
return m_calculatedLinearDiff[axisIndex];
|
||||
}
|
||||
|
||||
|
||||
btScalar btGeneric6DofConstraint::getAngle(int axisIndex) const
|
||||
{
|
||||
return m_calculatedAxisAngleDiff[axisIndex];
|
||||
}
|
||||
|
||||
|
||||
@ -839,7 +844,6 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
|
||||
|
||||
|
||||
|
||||
|
||||
btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
|
||||
: btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
|
||||
{
|
||||
@ -848,6 +852,7 @@ btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, b
|
||||
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::setStiffness(int index, btScalar stiffness)
|
||||
}
|
||||
|
||||
|
||||
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::setEquilibriumPoint(int index)
|
||||
|
||||
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 @@ void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* inf
|
||||
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 @@ void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* inf
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -382,14 +382,21 @@ public:
|
||||
|
||||
//! 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 @@ protected:
|
||||
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);
|
||||
|
@ -54,6 +54,20 @@ PyObject* KX_ConstraintWrapper::PyGetConstraintId()
|
||||
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 @@ int KX_ConstraintWrapper::py_setattro(PyObject *attr,PyObject* value)
|
||||
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
|
||||
};
|
||||
|
||||
|
@ -45,6 +45,7 @@ public:
|
||||
|
||||
KX_PYMETHOD_NOARGS(KX_ConstraintWrapper,GetConstraintId);
|
||||
KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
|
||||
KX_PYMETHOD(KX_ConstraintWrapper,GetParam);
|
||||
|
||||
private:
|
||||
int m_constraintId;
|
||||
|
@ -1019,7 +1019,8 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
|
||||
//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);
|
||||
}
|
||||
|
@ -1786,6 +1786,45 @@ CcdPhysicsEnvironment::~CcdPhysicsEnvironment()
|
||||
}
|
||||
|
||||
|
||||
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 @@ void CcdPhysicsEnvironment::setConstraintParam(int constraintId,int param,float
|
||||
{
|
||||
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;
|
||||
|
@ -149,7 +149,10 @@ protected:
|
||||
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);
|
||||
|
||||
|
@ -88,6 +88,11 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual float getConstraintParam(int constraintId,int param)
|
||||
{
|
||||
return 0.f;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif //_DUMMYPHYSICSENVIRONMENT
|
||||
|
@ -88,6 +88,10 @@ public:
|
||||
virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position);
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight);
|
||||
|
||||
virtual float getConstraintParam(int constraintId,int param)
|
||||
{
|
||||
return 0.f;
|
||||
}
|
||||
virtual void setConstraintParam(int constraintId,int param,float value,float value1)
|
||||
{
|
||||
}
|
||||
|
@ -159,6 +159,7 @@ class PHY_IPhysicsEnvironment
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight)=0;
|
||||
|
||||
virtual void setConstraintParam(int constraintId,int param,float value,float value1) = 0;
|
||||
virtual float getConstraintParam(int constraintId,int param) = 0;
|
||||
};
|
||||
|
||||
#endif //_IPHYSICSENVIRONMENT
|
||||
|
Loading…
Reference in New Issue
Block a user