Changeset 8393 for code/trunk/src/external/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
- Timestamp:
- May 3, 2011, 5:07:42 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/external/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
r8351 r8393 58 58 } 59 59 60 #define MAX_OVERLAP btScalar(0.)61 62 60 63 61 … … 94 92 } 95 93 96 ///combined discrete/continuous sphere-triangle97 94 bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold) 98 95 { 99 96 100 97 const btVector3* vertices = &m_triangle->getVertexPtr(0); 101 const btVector3& c = sphereCenter; 102 btScalar r = m_sphere->getRadius(); 103 104 btVector3 delta (0,0,0); 98 99 btScalar radius = m_sphere->getRadius(); 100 btScalar radiusWithThreshold = radius + contactBreakingThreshold; 105 101 106 102 btVector3 normal = (vertices[1]-vertices[0]).cross(vertices[2]-vertices[0]); 107 103 normal.normalize(); 108 btVector3 p1ToCentre = c- vertices[0];104 btVector3 p1ToCentre = sphereCenter - vertices[0]; 109 105 btScalar distanceFromPlane = p1ToCentre.dot(normal); 110 106 … … 112 108 { 113 109 //triangle facing the other way 114 115 110 distanceFromPlane *= btScalar(-1.); 116 111 normal *= btScalar(-1.); 117 112 } 118 113 119 btScalar contactMargin = contactBreakingThreshold; 120 bool isInsideContactPlane = distanceFromPlane < r + contactMargin; 121 bool isInsideShellPlane = distanceFromPlane < r; 122 123 btScalar deltaDotNormal = delta.dot(normal); 124 if (!isInsideShellPlane && deltaDotNormal >= btScalar(0.0)) 125 return false; 126 114 bool isInsideContactPlane = distanceFromPlane < radiusWithThreshold; 115 127 116 // Check for contact / intersection 128 117 bool hasContact = false; 129 118 btVector3 contactPoint; 130 119 if (isInsideContactPlane) { 131 if (facecontains( c,vertices,normal)) {120 if (facecontains(sphereCenter,vertices,normal)) { 132 121 // Inside the contact wedge - touches a point on the shell plane 133 122 hasContact = true; 134 contactPoint = c- normal*distanceFromPlane;123 contactPoint = sphereCenter - normal*distanceFromPlane; 135 124 } else { 136 125 // Could be inside one of the contact capsules 137 btScalar contactCapsuleRadiusSqr = (r + contactMargin) * (r + contactMargin);126 btScalar contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold; 138 127 btVector3 nearestOnEdge; 139 128 for (int i = 0; i < m_triangle->getNumEdges(); i++) { … … 144 133 m_triangle->getEdge(i,pa,pb); 145 134 146 btScalar distanceSqr = SegmentSqrDistance(pa,pb, c, nearestOnEdge);135 btScalar distanceSqr = SegmentSqrDistance(pa,pb,sphereCenter, nearestOnEdge); 147 136 if (distanceSqr < contactCapsuleRadiusSqr) { 148 137 // Yep, we're inside a capsule … … 156 145 157 146 if (hasContact) { 158 btVector3 contactToCentre = c- contactPoint;147 btVector3 contactToCentre = sphereCenter - contactPoint; 159 148 btScalar distanceSqr = contactToCentre.length2(); 160 if (distanceSqr < (r - MAX_OVERLAP)*(r - MAX_OVERLAP)) { 161 btScalar distance = btSqrt(distanceSqr); 162 resultNormal = contactToCentre; 163 resultNormal.normalize(); 164 point = contactPoint; 165 depth = -(r-distance); 149 150 if (distanceSqr < radiusWithThreshold*radiusWithThreshold) 151 { 152 if (distanceSqr>SIMD_EPSILON) 153 { 154 btScalar distance = btSqrt(distanceSqr); 155 resultNormal = contactToCentre; 156 resultNormal.normalize(); 157 point = contactPoint; 158 depth = -(radius-distance); 159 } else 160 { 161 btScalar distance = 0.f; 162 resultNormal = normal; 163 point = contactPoint; 164 depth = -radius; 165 } 166 166 return true; 167 167 } 168 169 if (delta.dot(contactToCentre) >= btScalar(0.0))170 return false;171 172 // Moving towards the contact point -> collision173 point = contactPoint;174 timeOfImpact = btScalar(0.0);175 return true;176 168 } 177 169
Note: See TracChangeset
for help on using the changeset viewer.