Bullet Collision Detection & Physics Library: btManifoldResult.cpp Source File

Bullet Collision Detection & Physics Library

btManifoldResult.cpp
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2006 Erwin Coumans https://bulletphysics.org
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
15
16#include "btManifoldResult.h"
17#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
18#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
19#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
20
22 ContactAddedCallback gContactAddedCallback = 0;
23
24 CalculateCombinedCallback gCalculateCombinedRestitutionCallback = &btManifoldResult::calculateCombinedRestitution;
25 CalculateCombinedCallback gCalculateCombinedFrictionCallback = &btManifoldResult::calculateCombinedFriction;
26 CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback = &btManifoldResult::calculateCombinedRollingFriction;
27 CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback = &btManifoldResult::calculateCombinedSpinningFriction;
28 CalculateCombinedCallback gCalculateCombinedContactDampingCallback = &btManifoldResult::calculateCombinedContactDamping;
29 CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback = &btManifoldResult::calculateCombinedContactStiffness;
30
31 btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0, const btCollisionObject* body1)
32{
33 btScalar friction = body0->getRollingFriction() * body1->getFriction() + body1->getRollingFriction() * body0->getFriction();
34
35 const btScalar MAX_FRICTION = btScalar(10.);
36 if (friction < -MAX_FRICTION)
37 friction = -MAX_FRICTION;
38 if (friction > MAX_FRICTION)
39 friction = MAX_FRICTION;
40 return friction;
41}
42
43 btScalar btManifoldResult::calculateCombinedSpinningFriction(const btCollisionObject* body0, const btCollisionObject* body1)
44{
45 btScalar friction = body0->getSpinningFriction() * body1->getFriction() + body1->getSpinningFriction() * body0->getFriction();
46
47 const btScalar MAX_FRICTION = btScalar(10.);
48 if (friction < -MAX_FRICTION)
49 friction = -MAX_FRICTION;
50 if (friction > MAX_FRICTION)
51 friction = MAX_FRICTION;
52 return friction;
53}
54
56 btScalar btManifoldResult::calculateCombinedFriction(const btCollisionObject* body0, const btCollisionObject* body1)
57{
58 btScalar friction = body0->getFriction() * body1->getFriction();
59
60 const btScalar MAX_FRICTION = btScalar(10.);
61 if (friction < -MAX_FRICTION)
62 friction = -MAX_FRICTION;
63 if (friction > MAX_FRICTION)
64 friction = MAX_FRICTION;
65 return friction;
66}
67
68 btScalar btManifoldResult::calculateCombinedRestitution(const btCollisionObject* body0, const btCollisionObject* body1)
69{
70 return body0->getRestitution() * body1->getRestitution();
71}
72
73 btScalar btManifoldResult::calculateCombinedContactDamping(const btCollisionObject* body0, const btCollisionObject* body1)
74{
75 return body0->getContactDamping() + body1->getContactDamping();
76}
77
78 btScalar btManifoldResult::calculateCombinedContactStiffness(const btCollisionObject* body0, const btCollisionObject* body1)
79{
80 btScalar s0 = body0->getContactStiffness();
81 btScalar s1 = body1->getContactStiffness();
82
83 btScalar tmp0 = btScalar(1) / s0;
84 btScalar tmp1 = btScalar(1) / s1;
85 btScalar combinedStiffness = btScalar(1) / (tmp0 + tmp1);
86 return combinedStiffness;
87}
88
89 btManifoldResult::btManifoldResult(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
90 : m_manifoldPtr(0),
91 m_body0Wrap(body0Wrap),
92 m_body1Wrap(body1Wrap)
93 ,
94 m_partId0(-1),
95 m_partId1(-1),
96 m_index0(-1),
97 m_index1(-1)
98 ,
99 m_closestPointDistanceThreshold(0)
100{
101}
102
103 void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
104{
105 btAssert(m_manifoldPtr);
106 //order in manifold needs to match
107
108 if (depth > m_manifoldPtr->getContactBreakingThreshold())
109 // if (depth > m_manifoldPtr->getContactProcessingThreshold())
110 return;
111
112 bool isSwapped = m_manifoldPtr->getBody0() != m_body0Wrap->getCollisionObject();
113 bool isNewCollision = m_manifoldPtr->getNumContacts() == 0;
114
115 btVector3 pointA = pointInWorld + normalOnBInWorld * depth;
116
117 btVector3 localA;
118 btVector3 localB;
119
120 if (isSwapped)
121 {
122 localA = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
123 localB = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
124 }
125 else
126 {
127 localA = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
128 localB = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
129 }
130
131 btManifoldPoint newPt(localA, localB, normalOnBInWorld, depth);
132 newPt.m_positionWorldOnA = pointA;
133 newPt.m_positionWorldOnB = pointInWorld;
134
135 int insertIndex = m_manifoldPtr->getCacheEntry(newPt);
136
137 newPt.m_combinedFriction = gCalculateCombinedFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
138 newPt.m_combinedRestitution = gCalculateCombinedRestitutionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
139 newPt.m_combinedRollingFriction = gCalculateCombinedRollingFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
140 newPt.m_combinedSpinningFriction = gCalculateCombinedSpinningFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
141
142 if ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING) ||
143 (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING))
144 {
145 newPt.m_combinedContactDamping1 = gCalculateCombinedContactDampingCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
146 newPt.m_combinedContactStiffness1 = gCalculateCombinedContactStiffnessCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
147 newPt.m_contactPointFlags |= BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING;
148 }
149
150 if ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_FRICTION_ANCHOR) ||
151 (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_FRICTION_ANCHOR))
152 {
153 newPt.m_contactPointFlags |= BT_CONTACT_FLAG_FRICTION_ANCHOR;
154 }
155
156 btPlaneSpace1(newPt.m_normalWorldOnB, newPt.m_lateralFrictionDir1, newPt.m_lateralFrictionDir2);
157
158 //BP mod, store contact triangles.
159 if (isSwapped)
160 {
161 newPt.m_partId0 = m_partId1;
162 newPt.m_partId1 = m_partId0;
163 newPt.m_index0 = m_index1;
164 newPt.m_index1 = m_index0;
165 }
166 else
167 {
168 newPt.m_partId0 = m_partId0;
169 newPt.m_partId1 = m_partId1;
170 newPt.m_index0 = m_index0;
171 newPt.m_index1 = m_index1;
172 }
173 //printf("depth=%f\n",depth);
175 if (insertIndex >= 0)
176 {
177 //const btManifoldPoint& oldPoint = m_manifoldPtr->getContactPoint(insertIndex);
178 m_manifoldPtr->replaceContactPoint(newPt, insertIndex);
179 }
180 else
181 {
182 insertIndex = m_manifoldPtr->addManifoldPoint(newPt);
183 }
184
185 //User can override friction and/or restitution
186 if (gContactAddedCallback &&
187 //and if either of the two bodies requires custom material
188 ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) ||
189 (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)))
190 {
191 //experimental feature info, for per-triangle material etc.
192 const btCollisionObjectWrapper* obj0Wrap = isSwapped ? m_body1Wrap : m_body0Wrap;
193 const btCollisionObjectWrapper* obj1Wrap = isSwapped ? m_body0Wrap : m_body1Wrap;
194 (*gContactAddedCallback)(m_manifoldPtr->getContactPoint(insertIndex), obj0Wrap, newPt.m_partId0, newPt.m_index0, obj1Wrap, newPt.m_partId1, newPt.m_index1);
195 }
196
197 if (gContactStartedCallback && isNewCollision)
198 {
199 gContactStartedCallback(m_manifoldPtr);
200 }
201}
btCollisionObjectWrapper.h
btCollisionObject.h
BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING
@ BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING
Definition btManifoldPoint.h:45
BT_CONTACT_FLAG_FRICTION_ANCHOR
@ BT_CONTACT_FLAG_FRICTION_ANCHOR
Definition btManifoldPoint.h:46
gCalculateCombinedContactStiffnessCallback
CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback
Definition btManifoldResult.cpp:29
gCalculateCombinedContactDampingCallback
CalculateCombinedCallback gCalculateCombinedContactDampingCallback
Definition btManifoldResult.cpp:28
gContactAddedCallback
ContactAddedCallback gContactAddedCallback
This is to allow MaterialCombiner/Custom Friction/Restitution values.
Definition btManifoldResult.cpp:22
gCalculateCombinedSpinningFrictionCallback
CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback
Definition btManifoldResult.cpp:27
gCalculateCombinedFrictionCallback
CalculateCombinedCallback gCalculateCombinedFrictionCallback
Definition btManifoldResult.cpp:25
gCalculateCombinedRollingFrictionCallback
CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback
Definition btManifoldResult.cpp:26
gCalculateCombinedRestitutionCallback
CalculateCombinedCallback gCalculateCombinedRestitutionCallback
Definition btManifoldResult.cpp:24
btManifoldResult.h
gCalculateCombinedContactStiffnessCallback
CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback
Definition btManifoldResult.cpp:29
gCalculateCombinedContactDampingCallback
CalculateCombinedCallback gCalculateCombinedContactDampingCallback
Definition btManifoldResult.cpp:28
gContactAddedCallback
ContactAddedCallback gContactAddedCallback
This is to allow MaterialCombiner/Custom Friction/Restitution values.
Definition btManifoldResult.cpp:22
gCalculateCombinedSpinningFrictionCallback
CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback
Definition btManifoldResult.cpp:27
gCalculateCombinedFrictionCallback
CalculateCombinedCallback gCalculateCombinedFrictionCallback
Definition btManifoldResult.cpp:25
gCalculateCombinedRollingFrictionCallback
CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback
Definition btManifoldResult.cpp:26
ContactAddedCallback
bool(* ContactAddedCallback)(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1)
Definition btManifoldResult.h:31
CalculateCombinedCallback
btScalar(* CalculateCombinedCallback)(const btCollisionObject *body0, const btCollisionObject *body1)
These callbacks are used to customize the algorith that combine restitution, friction,...
Definition btManifoldResult.h:37
gCalculateCombinedRestitutionCallback
CalculateCombinedCallback gCalculateCombinedRestitutionCallback
Definition btManifoldResult.cpp:24
gContactStartedCallback
ContactStartedCallback gContactStartedCallback
Definition btPersistentManifold.cpp:29
btPersistentManifold.h
btScalar
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:314
btAssert
#define btAssert(x)
Definition btScalar.h:153
btPlaneSpace1
void btPlaneSpace1(const T &n, T &p, T &q)
Definition btVector3.h:1251
btCollisionObject
btCollisionObject can be used to manage collision detection objects.
Definition btCollisionObject.h:51
btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK
@ CF_CUSTOM_MATERIAL_CALLBACK
Definition btCollisionObject.h:135
btCollisionObject::CF_HAS_FRICTION_ANCHOR
@ CF_HAS_FRICTION_ANCHOR
Definition btCollisionObject.h:141
btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING
@ CF_HAS_CONTACT_STIFFNESS_DAMPING
Definition btCollisionObject.h:139
btCollisionObject::getContactStiffness
btScalar getContactStiffness() const
Definition btCollisionObject.h:363
btCollisionObject::getSpinningFriction
btScalar getSpinningFriction() const
Definition btCollisionObject.h:344
btCollisionObject::getFriction
btScalar getFriction() const
Definition btCollisionObject.h:325
btCollisionObject::getContactDamping
btScalar getContactDamping() const
Definition btCollisionObject.h:368
btCollisionObject::getRestitution
btScalar getRestitution() const
Definition btCollisionObject.h:316
btCollisionObject::getRollingFriction
btScalar getRollingFriction() const
Definition btCollisionObject.h:335
btManifoldPoint
ManifoldContactPoint collects and maintains persistent contactpoints.
Definition btManifoldPoint.h:52
btManifoldPoint::m_partId0
int m_partId0
Definition btManifoldPoint.h:117
btManifoldPoint::m_index1
int m_index1
Definition btManifoldPoint.h:120
btManifoldPoint::m_combinedSpinningFriction
btScalar m_combinedSpinningFriction
Definition btManifoldPoint.h:113
btManifoldPoint::m_combinedRollingFriction
btScalar m_combinedRollingFriction
Definition btManifoldPoint.h:112
btManifoldPoint::m_contactPointFlags
int m_contactPointFlags
Definition btManifoldPoint.h:124
btManifoldPoint::m_combinedContactStiffness1
btScalar m_combinedContactStiffness1
Definition btManifoldPoint.h:135
btManifoldPoint::m_combinedRestitution
btScalar m_combinedRestitution
Definition btManifoldPoint.h:114
btManifoldPoint::m_lateralFrictionDir2
btVector3 m_lateralFrictionDir2
Definition btManifoldPoint.h:148
btManifoldPoint::m_positionWorldOnA
btVector3 m_positionWorldOnA
m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity
Definition btManifoldPoint.h:107
btManifoldPoint::m_index0
int m_index0
Definition btManifoldPoint.h:119
btManifoldPoint::m_combinedContactDamping1
btScalar m_combinedContactDamping1
Definition btManifoldPoint.h:140
btManifoldPoint::m_partId1
int m_partId1
Definition btManifoldPoint.h:118
btManifoldPoint::m_normalWorldOnB
btVector3 m_normalWorldOnB
Definition btManifoldPoint.h:108
btManifoldPoint::m_combinedFriction
btScalar m_combinedFriction
Definition btManifoldPoint.h:111
btManifoldPoint::m_positionWorldOnB
btVector3 m_positionWorldOnB
Definition btManifoldPoint.h:105
btManifoldPoint::m_lateralFrictionDir1
btVector3 m_lateralFrictionDir1
Definition btManifoldPoint.h:147
btManifoldResult::m_body0Wrap
const btCollisionObjectWrapper * m_body0Wrap
Definition btManifoldResult.h:52
btManifoldResult::m_partId0
int m_partId0
Definition btManifoldResult.h:54
btManifoldResult::calculateCombinedFriction
static btScalar calculateCombinedFriction(const btCollisionObject *body0, const btCollisionObject *body1)
User can override this material combiner by implementing gContactAddedCallback and setting body0->m_c...
Definition btManifoldResult.cpp:56
btManifoldResult::btManifoldResult
btManifoldResult()
Definition btManifoldResult.h:60
btManifoldResult::calculateCombinedContactDamping
static btScalar calculateCombinedContactDamping(const btCollisionObject *body0, const btCollisionObject *body1)
Definition btManifoldResult.cpp:73
btManifoldResult::m_body1Wrap
const btCollisionObjectWrapper * m_body1Wrap
Definition btManifoldResult.h:53
btManifoldResult::calculateCombinedContactStiffness
static btScalar calculateCombinedContactStiffness(const btCollisionObject *body0, const btCollisionObject *body1)
Definition btManifoldResult.cpp:78
btManifoldResult::m_partId1
int m_partId1
Definition btManifoldResult.h:55
btManifoldResult::calculateCombinedSpinningFriction
static btScalar calculateCombinedSpinningFriction(const btCollisionObject *body0, const btCollisionObject *body1)
Definition btManifoldResult.cpp:43
btManifoldResult::calculateCombinedRollingFriction
static btScalar calculateCombinedRollingFriction(const btCollisionObject *body0, const btCollisionObject *body1)
Definition btManifoldResult.cpp:31
btManifoldResult::m_index0
int m_index0
Definition btManifoldResult.h:56
btManifoldResult::calculateCombinedRestitution
static btScalar calculateCombinedRestitution(const btCollisionObject *body0, const btCollisionObject *body1)
in the future we can let the user override the methods to combine restitution and friction
Definition btManifoldResult.cpp:68
btManifoldResult::m_closestPointDistanceThreshold
btScalar m_closestPointDistanceThreshold
Definition btManifoldResult.h:152
btManifoldResult::m_manifoldPtr
btPersistentManifold * m_manifoldPtr
Definition btManifoldResult.h:50
btManifoldResult::addContactPoint
virtual void addContactPoint(const btVector3 &normalOnBInWorld, const btVector3 &pointInWorld, btScalar depth)
Definition btManifoldResult.cpp:103
btManifoldResult::m_index1
int m_index1
Definition btManifoldResult.h:57
btVector3
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:82
btCollisionObjectWrapper
Definition btCollisionObjectWrapper.h:18