forked from bartvdbraak/blender
fixed a crashing bug in new vehicle physics, and removed some debugging code in contact/friction physics code.
This commit is contained in:
parent
1d5cca805b
commit
cf2f1956de
@ -124,15 +124,17 @@ void CollisionWorld::RemoveCollisionObject(CollisionObject* collisionObject)
|
|||||||
//bool removeFromBroadphase = false;
|
//bool removeFromBroadphase = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
/*BroadphaseInterface* scene = */GetBroadphase();
|
|
||||||
BroadphaseProxy* bp = collisionObject->m_broadphaseHandle;
|
|
||||||
|
|
||||||
|
BroadphaseProxy* bp = collisionObject->m_broadphaseHandle;
|
||||||
|
if (bp)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// only clear the cached algorithms
|
// only clear the cached algorithms
|
||||||
//
|
//
|
||||||
GetBroadphase()->CleanProxyFromPairs(bp);
|
GetBroadphase()->CleanProxyFromPairs(bp);
|
||||||
GetBroadphase()->DestroyProxy(bp);
|
GetBroadphase()->DestroyProxy(bp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<CollisionObject*>::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject);
|
std::vector<CollisionObject*>::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject);
|
||||||
|
@ -128,7 +128,7 @@ bool MinkowskiPenetrationDepthSolver::CalcPenDepth(SimplexSolverInterface& simpl
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//#define DEBUG_DRAW 1
|
||||||
#ifdef DEBUG_DRAW
|
#ifdef DEBUG_DRAW
|
||||||
if (debugDraw)
|
if (debugDraw)
|
||||||
{
|
{
|
||||||
@ -165,7 +165,9 @@ bool MinkowskiPenetrationDepthSolver::CalcPenDepth(SimplexSolverInterface& simpl
|
|||||||
MyResult res;
|
MyResult res;
|
||||||
gjkdet.GetClosestPoints(input,res,debugDraw);
|
gjkdet.GetClosestPoints(input,res,debugDraw);
|
||||||
|
|
||||||
|
//the penetration depth is over-estimated, relax it
|
||||||
|
float penetration_relaxation= 0.1f;
|
||||||
|
minNorm*=penetration_relaxation;
|
||||||
|
|
||||||
if (res.m_hasResult)
|
if (res.m_hasResult)
|
||||||
{
|
{
|
||||||
@ -185,3 +187,6 @@ bool MinkowskiPenetrationDepthSolver::CalcPenDepth(SimplexSolverInterface& simpl
|
|||||||
}
|
}
|
||||||
return res.m_hasResult;
|
return res.m_hasResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,18 +123,6 @@ float resolveSingleCollision(
|
|||||||
|
|
||||||
// printf("distance=%f\n",distance);
|
// printf("distance=%f\n",distance);
|
||||||
|
|
||||||
if (distance>0.f)
|
|
||||||
{
|
|
||||||
contactPoint.m_appliedImpulse = 0.f;
|
|
||||||
contactPoint.m_accumulatedTangentImpulse0 = 0.f;
|
|
||||||
contactPoint.m_accumulatedTangentImpulse1 = 0.f;
|
|
||||||
|
|
||||||
return 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAXPENETRATIONPERFRAME -0.05
|
|
||||||
distance = distance < MAXPENETRATIONPERFRAME? MAXPENETRATIONPERFRAME:distance;
|
|
||||||
|
|
||||||
const SimdVector3& normal = contactPoint.m_normalWorldOnB;
|
const SimdVector3& normal = contactPoint.m_normalWorldOnB;
|
||||||
|
|
||||||
SimdVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
|
SimdVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
|
||||||
@ -153,7 +141,7 @@ float resolveSingleCollision(
|
|||||||
SimdScalar Kfps = 1.f / solverInfo.m_timeStep ;
|
SimdScalar Kfps = 1.f / solverInfo.m_timeStep ;
|
||||||
|
|
||||||
float damping = solverInfo.m_damping ;
|
float damping = solverInfo.m_damping ;
|
||||||
float Kerp = solverInfo.m_tau;
|
float Kerp = solverInfo.m_erp;
|
||||||
|
|
||||||
if (useGlobalSettingContacts)
|
if (useGlobalSettingContacts)
|
||||||
{
|
{
|
||||||
@ -168,7 +156,7 @@ float resolveSingleCollision(
|
|||||||
float clipDist = distance + allowedPenetration;
|
float clipDist = distance + allowedPenetration;
|
||||||
float dist = (clipDist > 0.f) ? 0.f : clipDist;
|
float dist = (clipDist > 0.f) ? 0.f : clipDist;
|
||||||
//distance = 0.f;
|
//distance = 0.f;
|
||||||
SimdScalar positionalError = Kcor *-clipDist;
|
SimdScalar positionalError = Kcor *-dist;
|
||||||
//jacDiagABInv;
|
//jacDiagABInv;
|
||||||
SimdScalar velocityError = -(1.0f + restitution) * rel_vel;// * damping;
|
SimdScalar velocityError = -(1.0f + restitution) * rel_vel;// * damping;
|
||||||
|
|
||||||
|
@ -23,11 +23,12 @@ struct ContactSolverInfo
|
|||||||
inline ContactSolverInfo()
|
inline ContactSolverInfo()
|
||||||
{
|
{
|
||||||
m_tau = 0.4f;
|
m_tau = 0.4f;
|
||||||
m_damping = 0.9f;
|
m_damping = 1.0f;
|
||||||
m_friction = 0.3f;
|
m_friction = 0.3f;
|
||||||
m_restitution = 0.f;
|
m_restitution = 0.f;
|
||||||
m_maxErrorReduction = 20.f;
|
m_maxErrorReduction = 20.f;
|
||||||
m_numIterations = 10;
|
m_numIterations = 10;
|
||||||
|
m_erp = 0.4f;
|
||||||
m_sor = 1.3f;
|
m_sor = 1.3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +40,7 @@ struct ContactSolverInfo
|
|||||||
int m_numIterations;
|
int m_numIterations;
|
||||||
float m_maxErrorReduction;
|
float m_maxErrorReduction;
|
||||||
float m_sor;
|
float m_sor;
|
||||||
|
float m_erp;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,13 +26,6 @@ subject to the following restrictions:
|
|||||||
#include "JacobianEntry.h"
|
#include "JacobianEntry.h"
|
||||||
#include "GEN_MinMax.h"
|
#include "GEN_MinMax.h"
|
||||||
|
|
||||||
//debugging
|
|
||||||
bool doApplyImpulse = true;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool useImpulseFriction = true;//true;//false;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -97,6 +90,8 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
|
|||||||
for (int i=0;i<numpoints ;i++)
|
for (int i=0;i<numpoints ;i++)
|
||||||
{
|
{
|
||||||
ManifoldPoint& cp = manifoldPtr->GetContactPoint(i);
|
ManifoldPoint& cp = manifoldPtr->GetContactPoint(i);
|
||||||
|
if (cp.GetDistance() <= 0.f)
|
||||||
|
{
|
||||||
const SimdVector3& pos1 = cp.GetPositionWorldOnA();
|
const SimdVector3& pos1 = cp.GetPositionWorldOnA();
|
||||||
const SimdVector3& pos2 = cp.GetPositionWorldOnB();
|
const SimdVector3& pos2 = cp.GetPositionWorldOnB();
|
||||||
|
|
||||||
@ -147,7 +142,7 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
|
|||||||
//apply previous frames impulse on both bodies
|
//apply previous frames impulse on both bodies
|
||||||
body0->applyImpulse(totalImpulse, rel_pos1);
|
body0->applyImpulse(totalImpulse, rel_pos1);
|
||||||
body1->applyImpulse(-totalImpulse, rel_pos2);
|
body1->applyImpulse(-totalImpulse, rel_pos2);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,6 +161,8 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
|
|||||||
j=i;
|
j=i;
|
||||||
|
|
||||||
ManifoldPoint& cp = manifoldPtr->GetContactPoint(j);
|
ManifoldPoint& cp = manifoldPtr->GetContactPoint(j);
|
||||||
|
if (cp.GetDistance() <= 0.f)
|
||||||
|
{
|
||||||
|
|
||||||
if (iter == 0)
|
if (iter == 0)
|
||||||
{
|
{
|
||||||
@ -189,6 +186,7 @@ float SimpleConstraintSolver::Solve(PersistentManifold* manifoldPtr, const Conta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return maxImpulse;
|
return maxImpulse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,7 +206,7 @@ float SimpleConstraintSolver::SolveFriction(PersistentManifold* manifoldPtr, con
|
|||||||
int j=i;
|
int j=i;
|
||||||
|
|
||||||
ManifoldPoint& cp = manifoldPtr->GetContactPoint(j);
|
ManifoldPoint& cp = manifoldPtr->GetContactPoint(j);
|
||||||
|
if (cp.GetDistance() <= 0.f)
|
||||||
{
|
{
|
||||||
|
|
||||||
resolveSingleFriction(
|
resolveSingleFriction(
|
||||||
|
Loading…
Reference in New Issue
Block a user