Adding support for lateral friction to getContactPoints()

This commit is contained in:
Julian Viereck
2018-09-24 09:46:56 -04:00
parent cdd56e4641
commit 219dfc757a
4 changed files with 61 additions and 10 deletions

0
clang-format-all.sh Normal file → Executable file
View File

View File

@@ -6062,7 +6062,13 @@ bool PhysicsServerCommandProcessor::processRequestContactpointInformationCommand
pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j]; pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j];
} }
pt.m_normalForce = srcPt.getAppliedImpulse() / m_data->m_physicsDeltaTime; pt.m_normalForce = srcPt.getAppliedImpulse() / m_data->m_physicsDeltaTime;
// pt.m_linearFrictionForce = srcPt.m_appliedImpulseLateral1; pt.m_linearFrictionForce1 = srcPt.m_appliedImpulseLateral1 / m_data->m_physicsDeltaTime;
pt.m_linearFrictionForce2 = srcPt.m_appliedImpulseLateral2 / m_data->m_physicsDeltaTime;
for (int j = 0; j < 3; j++)
{
pt.m_linearFrictionDirection1[j] = srcPt.m_lateralFrictionDir1[j];
pt.m_linearFrictionDirection2[j] = srcPt.m_lateralFrictionDir2[j];
}
m_data->m_cachedContactPoints.push_back(pt); m_data->m_cachedContactPoints.push_back(pt);
} }
} }
@@ -6287,7 +6293,13 @@ bool PhysicsServerCommandProcessor::processRequestContactpointInformationCommand
pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j]; pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j];
} }
pt.m_normalForce = srcPt.getAppliedImpulse() / m_deltaTime; pt.m_normalForce = srcPt.getAppliedImpulse() / m_deltaTime;
// pt.m_linearFrictionForce = srcPt.m_appliedImpulseLateral1; pt.m_linearFrictionForce1 = srcPt.m_appliedImpulseLateral1 / m_deltaTime;
pt.m_linearFrictionForce2 = srcPt.m_appliedImpulseLateral2 / m_deltaTime;
for (int j = 0; j < 3; j++)
{
pt.m_linearFrictionDirection1[j] = srcPt.m_lateralFrictionDir1[j];
pt.m_linearFrictionDirection2[j] = srcPt.m_lateralFrictionDir2[j];
}
m_cachedContactPoints.push_back(pt); m_cachedContactPoints.push_back(pt);
} }
return 1; return 1;

View File

@@ -572,13 +572,10 @@ struct b3ContactPointData
double m_normalForce; double m_normalForce;
//todo: expose the friction forces as well double m_linearFrictionForce1;
// double m_linearFrictionDirection0[3]; double m_linearFrictionForce2;
// double m_linearFrictionForce0; double m_linearFrictionDirection1[3];
// double m_linearFrictionDirection1[3]; double m_linearFrictionDirection2[3];
// double m_linearFrictionForce1;
// double m_angularFrictionDirection[3];
// double m_angularFrictionForce;
}; };
enum enum

View File

@@ -5754,6 +5754,10 @@ static PyObject* MyConvertContactPoint(struct b3ContactInformation* contactPoint
8 double m_contactDistance;//negative number is penetration, positive 8 double m_contactDistance;//negative number is penetration, positive
is distance. is distance.
9 double m_normalForce; 9 double m_normalForce;
10 double m_linearFrictionForce1;
11 double double m_linearFrictionDirection1[3];
12 double m_linearFrictionForce2;
13 double double m_linearFrictionDirection2[3];
*/ */
int i; int i;
@@ -5761,7 +5765,7 @@ static PyObject* MyConvertContactPoint(struct b3ContactInformation* contactPoint
PyObject* pyResultList = PyTuple_New(contactPointPtr->m_numContactPoints); PyObject* pyResultList = PyTuple_New(contactPointPtr->m_numContactPoints);
for (i = 0; i < contactPointPtr->m_numContactPoints; i++) for (i = 0; i < contactPointPtr->m_numContactPoints; i++)
{ {
PyObject* contactObList = PyTuple_New(10); // see above 10 fields PyObject* contactObList = PyTuple_New(14); // see above 10 fields
PyObject* item; PyObject* item;
item = item =
PyInt_FromLong(contactPointPtr->m_contactPointData[i].m_contactFlags); PyInt_FromLong(contactPointPtr->m_contactPointData[i].m_contactFlags);
@@ -5832,6 +5836,44 @@ static PyObject* MyConvertContactPoint(struct b3ContactInformation* contactPoint
contactPointPtr->m_contactPointData[i].m_normalForce); contactPointPtr->m_contactPointData[i].m_normalForce);
PyTuple_SetItem(contactObList, 9, item); PyTuple_SetItem(contactObList, 9, item);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionForce1);
PyTuple_SetItem(contactObList, 10, item);
{
PyObject* posAObj = PyTuple_New(3);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection1[0]);
PyTuple_SetItem(posAObj, 0, item);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection1[1]);
PyTuple_SetItem(posAObj, 1, item);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection1[2]);
PyTuple_SetItem(posAObj, 2, item);
PyTuple_SetItem(contactObList, 11, posAObj);
}
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionForce2);
PyTuple_SetItem(contactObList, 12, item);
{
PyObject* posAObj = PyTuple_New(3);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection2[0]);
PyTuple_SetItem(posAObj, 0, item);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection2[1]);
PyTuple_SetItem(posAObj, 1, item);
item = PyFloat_FromDouble(
contactPointPtr->m_contactPointData[i].m_linearFrictionDirection2[2]);
PyTuple_SetItem(posAObj, 2, item);
PyTuple_SetItem(contactObList, 13, posAObj);
}
PyTuple_SetItem(pyResultList, i, contactObList); PyTuple_SetItem(pyResultList, i, contactObList);
} }
return pyResultList; return pyResultList;