Bullet Collision Detection & Physics Library
btConvex2dConvex2dAlgorithm.cpp
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. 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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
17 
18 //#include <stdio.h>
24 
25 
31 
36 
37 
38 
41 
43 
47 
49 {
52  m_simplexSolver = simplexSolver;
53  m_pdSolver = pdSolver;
54 }
55 
57 {
58 }
59 
60 btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver,int numPerturbationIterations, int minimumPointsPerturbationThreshold)
61 : btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
62 m_simplexSolver(simplexSolver),
63 m_pdSolver(pdSolver),
64 m_ownManifold (false),
65 m_manifoldPtr(mf),
66 m_lowLevelOfDetail(false),
67  m_numPerturbationIterations(numPerturbationIterations),
68 m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
69 {
70  (void)body0Wrap;
71  (void)body1Wrap;
72 }
73 
74 
75 
76 
78 {
79  if (m_ownManifold)
80  {
81  if (m_manifoldPtr)
83  }
84 }
85 
87 {
88  m_lowLevelOfDetail = useLowLevel;
89 }
90 
91 
92 
94 
95 
96 //
97 // Convex-Convex collision algorithm
98 //
100 {
101 
102  if (!m_manifoldPtr)
103  {
104  //swapped?
106  m_ownManifold = true;
107  }
109 
110  //comment-out next line to test multi-contact generation
111  //resultOut->getPersistentManifold()->clearManifold();
112 
113 
114  const btConvexShape* min0 = static_cast<const btConvexShape*>(body0Wrap->getCollisionShape());
115  const btConvexShape* min1 = static_cast<const btConvexShape*>(body1Wrap->getCollisionShape());
116 
117  btVector3 normalOnB;
118  btVector3 pointOnBWorld;
119 
120  {
121 
122 
124 
125  btGjkPairDetector gjkPairDetector(min0,min1,m_simplexSolver,m_pdSolver);
126  //TODO: if (dispatchInfo.m_useContinuous)
127  gjkPairDetector.setMinkowskiA(min0);
128  gjkPairDetector.setMinkowskiB(min1);
129 
130  {
133  }
134 
135  input.m_transformA = body0Wrap->getWorldTransform();
136  input.m_transformB = body1Wrap->getWorldTransform();
137 
138  gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
139 
140  btVector3 v0,v1;
141  btVector3 sepNormalWorldSpace;
142 
143  }
144 
145  if (m_ownManifold)
146  {
147  resultOut->refreshContactPoints();
148  }
149 
150 }
151 
152 
153 
154 
156 {
157  (void)resultOut;
158  (void)dispatchInfo;
160 
163  btScalar resultFraction = btScalar(1.);
164 
165 
166  btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2();
167  btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2();
168 
169  if (squareMot0 < col0->getCcdSquareMotionThreshold() &&
170  squareMot1 < col1->getCcdSquareMotionThreshold())
171  return resultFraction;
172 
173 
174  //An adhoc way of testing the Continuous Collision Detection algorithms
175  //One object is approximated as a sphere, to simplify things
176  //Starting in penetration should report no time of impact
177  //For proper CCD, better accuracy and handling of 'allowed' penetration should be added
178  //also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies)
179 
180 
182  {
183  btConvexShape* convex0 = static_cast<btConvexShape*>(col0->getCollisionShape());
184 
185  btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
187  btVoronoiSimplexSolver voronoiSimplex;
188  //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
190  btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex);
191  //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
193  col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
194  {
195 
196  //store result.m_fraction in both bodies
197 
198  if (col0->getHitFraction()> result.m_fraction)
199  col0->setHitFraction( result.m_fraction );
200 
201  if (col1->getHitFraction() > result.m_fraction)
202  col1->setHitFraction( result.m_fraction);
203 
204  if (resultFraction > result.m_fraction)
205  resultFraction = result.m_fraction;
206 
207  }
208 
209 
210 
211 
212  }
213 
215  {
216  btConvexShape* convex1 = static_cast<btConvexShape*>(col1->getCollisionShape());
217 
218  btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
220  btVoronoiSimplexSolver voronoiSimplex;
221  //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
223  btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex);
224  //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
226  col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
227  {
228 
229  //store result.m_fraction in both bodies
230 
231  if (col0->getHitFraction() > result.m_fraction)
232  col0->setHitFraction( result.m_fraction);
233 
234  if (col1->getHitFraction() > result.m_fraction)
235  col1->setHitFraction( result.m_fraction);
236 
237  if (resultFraction > result.m_fraction)
238  resultFraction = result.m_fraction;
239 
240  }
241  }
242 
243  return resultFraction;
244 
245 }
246 
virtual void releaseManifold(btPersistentManifold *manifold)=0
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
btScalar getCcdSweptSphereRadius() const
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
btScalar getContactBreakingThreshold() const
ConvexPenetrationDepthSolver provides an interface for penetration depth calculation.
void setMinkowskiB(const btConvexShape *minkB)
void setPersistentManifold(btPersistentManifold *manifoldPtr)
This class is not enabled yet (work-in-progress) to more aggressively activate objects.
void setHitFraction(btScalar hitFraction)
void setMinkowskiA(const btConvexShape *minkA)
virtual btScalar calculateTimeOfImpact(btCollisionObject *body0, btCollisionObject *body1, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
The btSphereShape implements an implicit sphere, centered around a local origin with radius...
Definition: btSphereShape.h:22
btManifoldResult is a helper class to manage contact results.
class btIDebugDraw * m_debugDraw
Definition: btDispatcher.h:58
btScalar getCcdSquareMotionThreshold() const
The btConvexShape is an abstract shape interface, implemented by all convex shapes such as btBoxShape...
Definition: btConvexShape.h:31
const btTransform & getInterpolationWorldTransform() const
GjkConvexCast performs a raycast on a convex object using support mapping.
virtual bool calcTimeOfImpact(const btTransform &fromA, const btTransform &toA, const btTransform &fromB, const btTransform &toB, CastResult &result)
cast a convex against another convex object
btTransform & getWorldTransform()
RayResult stores the closest result alternatively, add a callback method to decide about closest/all ...
Definition: btConvexCast.h:36
btVector3 & getOrigin()
Return the origin vector translation.
Definition: btTransform.h:117
#define btSimplexSolverInterface
btVoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points...
const btTransform & getWorldTransform() const
btCollisionObject can be used to manage collision detection objects.
virtual btPersistentManifold * getNewManifold(const btCollisionObject *b0, const btCollisionObject *b1)=0
virtual btScalar getMargin() const =0
const btCollisionShape * getCollisionShape() const
btScalar getHitFraction() const
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:83
btSimplexSolverInterface * m_simplexSolver
CreateFunc(btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *pdSolver)
btGjkPairDetector uses GJK to implement the btDiscreteCollisionDetectorInterface
btConvex2dConvex2dAlgorithm(btPersistentManifold *mf, const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
virtual void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
const btCollisionShape * getCollisionShape() const
btScalar gContactBreakingThreshold
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:266
btConvexPenetrationDepthSolver * m_pdSolver
virtual void getClosestPoints(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw, bool swapResults=false)
const btCollisionObject * getCollisionObject() const