summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerwincoumans <erwincoumans@google.com>2020-09-01 09:29:03 -0700
committerGitHub <noreply@github.com>2020-09-01 09:29:03 -0700
commit8fab756efd877bc874c5c1c30921d5aded97c054 (patch)
tree2d969e10520a210573c1327a1042341389185303
parente79e44db6c3efede15db5e7fa77c71f32ffd3367 (diff)
parent6fe6da0deecea6619f4fc79143ad9577aea205db (diff)
downloadbullet3-8fab756efd877bc874c5c1c30921d5aded97c054.tar.gz
Merge pull request #3026 from erwincoumans/master
PyBullet: fix cases where contact point objects are swapped, reported, attempt to fix travis python detection
-rw-r--r--examples/SharedMemory/PhysicsServerCommandProcessor.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp
index 7b4193ac3..8dfca94d9 100644
--- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp
+++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp
@@ -8068,6 +8068,21 @@ bool PhysicsServerCommandProcessor::processRequestContactpointInformationCommand
virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1)
{
+ const btCollisionObject* colObj = (btCollisionObject*)colObj0Wrap->getCollisionObject();
+ const btMultiBodyLinkCollider* mbl = btMultiBodyLinkCollider::upcast(colObj);
+ int bodyUniqueId = -1;
+ if (mbl)
+ {
+ bodyUniqueId = mbl->m_multiBody->getUserIndex2();
+ }
+ else
+ {
+ bodyUniqueId = colObj->getUserIndex2();
+ }
+
+
+ bool isSwapped = m_bodyUniqueIdA != bodyUniqueId;
+
if (cp.m_distance1 <= m_closestDistanceThreshold)
{
b3ContactPointData pt;
@@ -8080,9 +8095,18 @@ bool PhysicsServerCommandProcessor::processRequestContactpointInformationCommand
pt.m_linkIndexB = m_linkIndexB;
for (int j = 0; j < 3; j++)
{
- pt.m_contactNormalOnBInWS[j] = srcPt.m_normalWorldOnB[j];
- pt.m_positionOnAInWS[j] = srcPt.getPositionWorldOnA()[j];
- pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j];
+ if (isSwapped)
+ {
+ pt.m_contactNormalOnBInWS[j] = -srcPt.m_normalWorldOnB[j];
+ pt.m_positionOnAInWS[j] = srcPt.getPositionWorldOnB()[j];
+ pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnA()[j];
+ }
+ else
+ {
+ pt.m_contactNormalOnBInWS[j] = srcPt.m_normalWorldOnB[j];
+ pt.m_positionOnAInWS[j] = srcPt.getPositionWorldOnA()[j];
+ pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j];
+ }
}
pt.m_normalForce = srcPt.getAppliedImpulse() / m_deltaTime;
pt.m_linearFrictionForce1 = srcPt.m_appliedImpulseLateral1 / m_deltaTime;