71 btScalar denom = 1.0f - dirA_dot_dirB * dirA_dot_dirB;
79 tA = (dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB) / denom;
86 tB = tA * dirA_dot_dirB - dirB_dot_trans;
91 tA = tB * dirA_dot_dirB + dirA_dot_trans;
101 tA = tB * dirA_dot_dirB + dirA_dot_trans;
114 ptsVector = translation - offsetA + offsetB;
130 btVector3 directionA = transformA.getBasis().getColumn(capsuleAxisA);
131 btVector3 translationA = transformA.getOrigin();
132 btVector3 directionB = transformB.getBasis().getColumn(capsuleAxisB);
133 btVector3 translationB = transformB.getOrigin();
137 btVector3 translation = translationB - translationA;
147 directionA, capsuleLengthA, directionB, capsuleLengthB);
154 btScalar lenSqr = ptsVector.length2();
166 pointOnB = transformB.getOrigin() + offsetB + normalOnB * capsuleRadiusB;
186 m_pdSolver(pdSolver),
187 m_ownManifold(false),
189 m_lowLevelOfDetail(false),
190 #ifdef USE_SEPDISTANCE_UTIL2
194 m_numPerturbationIterations(numPerturbationIterations),
195 m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
212 m_lowLevelOfDetail = useLowLevel;
245 btVector3 endPtOrg = pointInWorld + normalOnBInWorld * orgDepth;
247 newDepth = (endPt - pointInWorld).
dot(normalOnBInWorld);
248 startPt = endPt - normalOnBInWorld * newDepth;
252 endPt = pointInWorld + normalOnBInWorld * orgDepth;
254 newDepth = (endPt - startPt).
dot(normalOnBInWorld);
258 #ifdef DEBUG_CONTACTS
279 m_ownManifold =
true;
291 #ifndef BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
302 capsuleB->getHalfHeight(), capsuleB->getRadius(), capsuleA->getUpAxis(), capsuleB->getUpAxis(),
324 0., capsuleB->getRadius(), capsuleA->getUpAxis(), 1,
346 capsuleB->getHalfHeight(), capsuleB->getRadius(), 1, capsuleB->getUpAxis(),
359 #ifdef USE_SEPDISTANCE_UTIL2
362 m_sepDistance.updateSeparatingDistance(body0->getWorldTransform(), body1->getWorldTransform());
376 #ifdef USE_SEPDISTANCE_UTIL2
392 input.m_maximumDistanceSquared *=
input.m_maximumDistanceSquared;
398 #ifdef USE_SEPDISTANCE_UTIL2
411 if (min0->isPolyhedral() && min1->isPolyhedral())
421 : m_hasContact(
false)
425 virtual void setShapeIdentifiersA(
int partId0,
int index0) {}
426 virtual void setShapeIdentifiersB(
int partId1,
int index1) {}
430 m_normalOnBInWorld = normalOnBInWorld;
431 m_pointInWorld = pointInWorld;
446 : m_originalResult(
result),
447 m_marginOnA(marginOnA),
448 m_marginOnB(marginOnB),
453 virtual void setShapeIdentifiersA(
int partId0,
int index0) {}
454 virtual void setShapeIdentifiersB(
int partId1,
int index1) {}
457 m_reportedDistance = depthOrg;
458 m_reportedNormalOnWorld = normalOnBInWorld;
460 btVector3 adjustedPointB = pointInWorldOrg - normalOnBInWorld * m_marginOnB;
461 m_reportedDistance = depthOrg + (m_marginOnA + m_marginOnB);
462 if (m_reportedDistance < 0.f)
464 m_foundResult =
true;
466 m_originalResult->
addContactPoint(normalOnBInWorld, adjustedPointB, m_reportedDistance);
477 btWithoutMarginResult withoutMargin(resultOut, min0Margin, min1Margin);
481 if (polyhedronA->getConvexPolyhedron() && polyhedronB->getConvexPolyhedron())
487 bool foundSepAxis =
true;
492 *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
495 sepNormalWorldSpace, *resultOut);
510 sepNormalWorldSpace = withoutMargin.m_reportedNormalOnWorld;
512 minDist = withoutMargin.m_reportedDistance;
517 foundSepAxis = withoutMargin.m_foundResult && minDist < 0;
556 bool foundSepAxis =
false;
557 bool useSatSepNormal =
true;
565 polyhedronB->initializePolyhedralFeatures();
569 btVector3 uniqueEdges[3] = {tri->m_vertices1[1] - tri->m_vertices1[0],
570 tri->m_vertices1[2] - tri->m_vertices1[1],
571 tri->m_vertices1[0] - tri->m_vertices1[2]};
573 uniqueEdges[0].normalize();
574 uniqueEdges[1].normalize();
575 uniqueEdges[2].normalize();
578 polyhedron.m_vertices.push_back(tri->m_vertices1[2]);
579 polyhedron.m_vertices.push_back(tri->m_vertices1[0]);
580 polyhedron.m_vertices.push_back(tri->m_vertices1[1]);
587 btVector3 faceNormal = uniqueEdges[0].cross(uniqueEdges[1]);
588 faceNormal.normalize();
598 combinedFaceA.
m_plane[0] = faceNormal[0];
599 combinedFaceA.
m_plane[1] = faceNormal[1];
600 combinedFaceA.
m_plane[2] = faceNormal[2];
601 combinedFaceA.
m_plane[3] = -planeEq;
602 polyhedron.m_faces.push_back(combinedFaceA);
609 btVector3 faceNormal = -uniqueEdges[0].cross(uniqueEdges[1]);
610 faceNormal.normalize();
621 combinedFaceB.
m_plane[0] = faceNormal[0];
622 combinedFaceB.
m_plane[1] = faceNormal[1];
623 combinedFaceB.
m_plane[2] = faceNormal[2];
624 combinedFaceB.
m_plane[3] = -planeEq;
625 polyhedron.m_faces.push_back(combinedFaceB);
628 polyhedron.m_uniqueEdges.push_back(uniqueEdges[0]);
629 polyhedron.m_uniqueEdges.push_back(uniqueEdges[1]);
630 polyhedron.m_uniqueEdges.push_back(uniqueEdges[2]);
631 polyhedron.initialize2();
633 polyhedronB->setPolyhedralFeatures(polyhedron);
637 *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
640 sepNormalWorldSpace, *resultOut);
652 if (dummy.m_hasContact && dummy.m_depth < 0)
656 if (dummy.m_normalOnBInWorld.dot(sepNormalWorldSpace) < 0.99)
665 sepNormalWorldSpace.setValue(0, 0, 1);
704 if (m_numPerturbationIterations && resultOut->
getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
717 bool perturbeA =
true;
720 btScalar radiusA = min0->getAngularMotionDisc();
721 btScalar radiusB = min1->getAngularMotionDisc();
722 if (radiusA < radiusB)
732 if (perturbeAngle > angleLimit)
733 perturbeAngle = angleLimit;
738 unPerturbedTransform =
input.m_transformA;
742 unPerturbedTransform =
input.m_transformB;
745 for (i = 0; i < m_numPerturbationIterations; i++)
757 #ifdef DEBUG_CONTACTS
765 #ifdef DEBUG_CONTACTS
777 #ifdef USE_SEPDISTANCE_UTIL2
780 m_sepDistance.initSeparatingDistance(gjkPairDetector.
getCachedSeparatingAxis(), sepDist, body0->getWorldTransform(), body1->getWorldTransform());
802 btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).
length2();
803 btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).
length2();
806 squareMot1 < col1->getCcdSquareMotionThreshold())
807 return resultFraction;
829 if (ccd1.
calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
830 col1->getWorldTransform(), col1->getInterpolationWorldTransform(),
result))
834 if (col0->getHitFraction() >
result.m_fraction)
835 col0->setHitFraction(
result.m_fraction);
837 if (col1->getHitFraction() >
result.m_fraction)
838 col1->setHitFraction(
result.m_fraction);
840 if (resultFraction >
result.m_fraction)
841 resultFraction =
result.m_fraction;
856 if (ccd1.
calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
857 col1->getWorldTransform(), col1->getInterpolationWorldTransform(),
result))
861 if (col0->getHitFraction() >
result.m_fraction)
862 col0->setHitFraction(
result.m_fraction);
864 if (col1->getHitFraction() >
result.m_fraction)
865 col1->setHitFraction(
result.m_fraction);
867 if (resultFraction >
result.m_fraction)
868 resultFraction =
result.m_fraction;
872 return resultFraction;
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
ATTR_WARN_UNUSED_RESULT const BMVert * v
@ TRIANGLE_SHAPE_PROXYTYPE
@ CAPSULE_SHAPE_PROXYTYPE
btCapsuleShape()
only used for btCapsuleShapeZ and btCapsuleShapeX subclasses.
btScalar getCcdSquareMotionThreshold() const
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
virtual btScalar getAngularMotionDisc() const
getAngularMotionDisc returns the maximum radius needed for Conservative Advancement to handle time-of...
static SIMD_FORCE_INLINE void segmentsClosestPoints(btVector3 &ptsVector, btVector3 &offsetA, btVector3 &offsetB, btScalar &tA, btScalar &tB, const btVector3 &translation, const btVector3 &dirA, btScalar hlenA, const btVector3 &dirB, btScalar hlenB)
btScalar gContactBreakingThreshold
static SIMD_FORCE_INLINE btScalar capsuleCapsuleDistance(btVector3 &normalOnB, btVector3 &pointOnB, btScalar capsuleLengthA, btScalar capsuleRadiusA, btScalar capsuleLengthB, btScalar capsuleRadiusB, int capsuleAxisA, int capsuleAxisB, const btTransform &transformA, const btTransform &transformB, btScalar distanceThreshold)
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btPolyhedralConvexShape()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define SIMD_FORCE_INLINE
btSphereShape(btScalar radius)
SIMD_FORCE_INLINE void btPlaneSpace1(const T &n, T &p, T &q)
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
SIMD_FORCE_INLINE btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
This class is not enabled yet (work-in-progress) to more aggressively activate objects.
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
SIMD_FORCE_INLINE void push_back(const T &_Val)
btDispatcher * m_dispatcher
virtual ~btConvexConvexAlgorithm()
virtual btScalar calculateTimeOfImpact(btCollisionObject *body0, btCollisionObject *body1, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
void setLowLevelOfDetail(bool useLowLevel)
btConvexConvexAlgorithm(btPersistentManifold *mf, const btCollisionAlgorithmConstructionInfo &ci, const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, btConvexPenetrationDepthSolver *pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
cache separating vector to speedup collision detection
virtual void processCollision(const btCollisionObjectWrapper *body0Wrap, const btCollisionObjectWrapper *body1Wrap, const btDispatcherInfo &dispatchInfo, btManifoldResult *resultOut)
ConvexPenetrationDepthSolver provides an interface for penetration depth calculation.
virtual void releaseManifold(btPersistentManifold *manifold)=0
virtual btPersistentManifold * getNewManifold(const btCollisionObject *b0, const btCollisionObject *b1)=0
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
btGjkPairDetector uses GJK to implement the btDiscreteCollisionDetectorInterface
virtual void getClosestPoints(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw, bool swapResults=false)
btScalar getCachedSeparatingDistance() const
void setIgnoreMargin(bool ignoreMargin)
don't use setIgnoreMargin, it's for Bullet's internal use
void setMinkowskiA(const btConvexShape *minkA)
const btVector3 & getCachedSeparatingAxis() const
void setMinkowskiB(const btConvexShape *minkB)
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
virtual void drawSphere(btScalar radius, const btTransform &transform, const btVector3 &color)
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
btManifoldResult is a helper class to manage contact results.
const btPersistentManifold * getPersistentManifold() const
void setPersistentManifold(btPersistentManifold *manifoldPtr)
btScalar m_closestPointDistanceThreshold
SIMD_FORCE_INLINE void refreshContactPoints()
virtual void addContactPoint(const btVector3 &normalOnBInWorld, const btVector3 &pointInWorld, btScalar depth)
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
SyclQueue void void size_t num_bytes void
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_global KernelShaderEvalInput * input
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T distance(const T &a, const T &b)
SIMD_FORCE_INLINE const btCollisionShape * getCollisionShape() const
SIMD_FORCE_INLINE const btTransform & getWorldTransform() const
SIMD_FORCE_INLINE const btCollisionObject * getCollisionObject() const
CreateFunc(btConvexPenetrationDepthSolver *pdSolver)
int m_numPerturbationIterations
int m_minimumPointsPerturbationThreshold
btConvexPenetrationDepthSolver * m_pdSolver
virtual void addContactPoint(const btVector3 &normalOnBInWorld, const btVector3 &pointInWorld, btScalar depth)=0
bool m_useConvexConservativeDistanceUtil
btScalar m_convexConservativeDistanceThreshold
class btIDebugDraw * m_debugDraw
btAlignedObjectArray< int > m_indices