git-svn-id: https://reactphysics3d.googlecode.com/svn/trunk@251 92aac97c-a6ce-11dd-a772-7fcde58d38e6
This commit is contained in:
parent
5fe08fef0a
commit
729f65a688
|
@ -87,7 +87,7 @@ bool NarrowPhaseSATAlgorithm::computeCollisionTest(const OBB* const obb1, const
|
||||||
Vector3D normal; // Contact normal (correspond to the separation axis with the smallest positive penetration depth)
|
Vector3D normal; // Contact normal (correspond to the separation axis with the smallest positive penetration depth)
|
||||||
// The contact normal point out of OBB1 toward OBB2
|
// The contact normal point out of OBB1 toward OBB2
|
||||||
bool side; // True if the interval 1 is at the left of interval 2 if a collision occurs and false otherwise
|
bool side; // True if the interval 1 is at the left of interval 2 if a collision occurs and false otherwise
|
||||||
double minPenetrationDepth = 0.0; // Minimum penetration depth detected among all separated axis
|
double minPenetrationDepth = DBL_MAX; // Minimum penetration depth detected among all separated axis
|
||||||
const double cutoff = 0.999999; // Cutoff for cosine of angles between box axes
|
const double cutoff = 0.999999; // Cutoff for cosine of angles between box axes
|
||||||
bool existsParallelPair = false; // True if there exists two face normals that are parallel.
|
bool existsParallelPair = false; // True if there exists two face normals that are parallel.
|
||||||
// This is used because if a parallel pair exists, it is sufficient
|
// This is used because if a parallel pair exists, it is sufficient
|
||||||
|
@ -273,7 +273,7 @@ bool NarrowPhaseSATAlgorithm::computeCollisionTest(const OBB* const obb1, const
|
||||||
//std::cout << "Current -- 1 -- min : " << currentInterval1.getMin() << std::endl;
|
//std::cout << "Current -- 1 -- min : " << currentInterval1.getMin() << std::endl;
|
||||||
//std::cout << "Timefirst : " << timeFirst.getValue() << std::endl;
|
//std::cout << "Timefirst : " << timeFirst.getValue() << std::endl;
|
||||||
std::cout << "CONTACT FOUND " << std::endl;
|
std::cout << "CONTACT FOUND " << std::endl;
|
||||||
|
normal; // TODO : Delete this
|
||||||
// Compute the collision contact
|
// Compute the collision contact
|
||||||
computeContact(obb1, obb2, normal.getUnit(), minPenetrationDepth, obb1->getExtremeVertices(normal), obb2->getExtremeVertices(normal.getOpposite()), contact);
|
computeContact(obb1, obb2, normal.getUnit(), minPenetrationDepth, obb1->getExtremeVertices(normal), obb2->getExtremeVertices(normal.getOpposite()), contact);
|
||||||
|
|
||||||
|
@ -493,6 +493,7 @@ void NarrowPhaseSATAlgorithm::computeContact(const OBB* const obb1, const OBB* c
|
||||||
unsigned int nbVerticesExtremeOBB2 = obb2ExtremePoints.size();
|
unsigned int nbVerticesExtremeOBB2 = obb2ExtremePoints.size();
|
||||||
assert(nbVerticesExtremeOBB1==1 || nbVerticesExtremeOBB1==2 || nbVerticesExtremeOBB1==4);
|
assert(nbVerticesExtremeOBB1==1 || nbVerticesExtremeOBB1==2 || nbVerticesExtremeOBB1==4);
|
||||||
assert(nbVerticesExtremeOBB2==1 || nbVerticesExtremeOBB2==2 || nbVerticesExtremeOBB2==4);
|
assert(nbVerticesExtremeOBB2==1 || nbVerticesExtremeOBB2==2 || nbVerticesExtremeOBB2==4);
|
||||||
|
assert(approxEqual(normal.length(), 1.0));
|
||||||
|
|
||||||
// If it's a Vertex-Something contact
|
// If it's a Vertex-Something contact
|
||||||
if (nbVerticesExtremeOBB1 == 1) {
|
if (nbVerticesExtremeOBB1 == 1) {
|
||||||
|
@ -541,13 +542,43 @@ void NarrowPhaseSATAlgorithm::computeContact(const OBB* const obb1, const OBB* c
|
||||||
*contact = new Contact(obb1->getBodyPointer(), obb2->getBodyPointer(), normal, penetrationDepth, contactSet);
|
*contact = new Contact(obb1->getBodyPointer(), obb2->getBodyPointer(), normal, penetrationDepth, contactSet);
|
||||||
}
|
}
|
||||||
else if(nbVerticesExtremeOBB1 == 2 && nbVerticesExtremeOBB2 == 4) { // If it's an edge-face contact
|
else if(nbVerticesExtremeOBB1 == 2 && nbVerticesExtremeOBB2 == 4) { // If it's an edge-face contact
|
||||||
// TODO : Complete this ...
|
// Compute the projection of the edge of OBB1 onto the same plane of the face of OBB2
|
||||||
|
std::vector<Vector3D> edge = projectPointsOntoPlane(obb1ExtremePoints, obb2ExtremePoints[0], normal);
|
||||||
|
|
||||||
|
// Clip the edge of OBB1 using the face of OBB2
|
||||||
|
std::vector<Vector3D> clippedEdge = clipSegmentWithRectangleInPlane(edge, obb2ExtremePoints);
|
||||||
|
|
||||||
|
// Move the clipped edge halway between the edge of OBB1 and the face of OBB2
|
||||||
|
clippedEdge = movePoints(clippedEdge, penetrationDepth/2.0 * normal.getOpposite());
|
||||||
|
|
||||||
|
// Create a new contact
|
||||||
|
*contact = new Contact(obb1->getBodyPointer(), obb2->getBodyPointer(), normal, penetrationDepth, clippedEdge);
|
||||||
}
|
}
|
||||||
else if(nbVerticesExtremeOBB1 == 4 && nbVerticesExtremeOBB2 == 2) { // If it's an edge-face contact
|
else if(nbVerticesExtremeOBB1 == 4 && nbVerticesExtremeOBB2 == 2) { // If it's an edge-face contact
|
||||||
// TODO : Complete this ...
|
// Compute the projection of the edge of OBB2 onto the same plane of the face of OBB1
|
||||||
|
std::vector<Vector3D> edge = projectPointsOntoPlane(obb2ExtremePoints, obb1ExtremePoints[0], normal);
|
||||||
|
|
||||||
|
// Clip the edge of OBB2 using the face of OBB1
|
||||||
|
std::vector<Vector3D> clippedEdge = clipSegmentWithRectangleInPlane(edge, obb1ExtremePoints);
|
||||||
|
|
||||||
|
// Move the clipped edge halfway between the face of OBB1 and the edge of OBB2
|
||||||
|
clippedEdge = movePoints(clippedEdge, penetrationDepth/2.0 * normal);
|
||||||
|
|
||||||
|
// Create a new contact
|
||||||
|
*contact = new Contact(obb1->getBodyPointer(), obb2->getBodyPointer(), normal, penetrationDepth, clippedEdge);
|
||||||
}
|
}
|
||||||
else { // If it's a face-face contact
|
else { // If it's a face-face contact
|
||||||
// TODO : Complete this ...
|
// Compute the projection of the face vertices of OBB2 onto the plane of the face of OBB1
|
||||||
|
std::vector<Vector3D> faceOBB2 = projectPointsOntoPlane(obb2ExtremePoints, obb1ExtremePoints[0], normal);
|
||||||
|
|
||||||
|
// Clip the face of OBB2 using the face of OBB1
|
||||||
|
std::vector<Vector3D> clippedFace = clipPolygonWithRectangleInPlane(faceOBB2, obb1ExtremePoints);
|
||||||
|
|
||||||
|
// Move the clipped face halfway between the face of OBB1 and the face of OBB2
|
||||||
|
clippedFace = movePoints(clippedFace, penetrationDepth/2.0 * normal);
|
||||||
|
|
||||||
|
// Create a new contact
|
||||||
|
*contact = new Contact(obb1->getBodyPointer(), obb2->getBodyPointer(), normal, penetrationDepth, clippedFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(*contact != 0);
|
assert(*contact != 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user