Vec2 CollisionDetector::QuadToQuad(const Vec2 quad1[4], const Vec2 quad2[4]) { Vec2 normals[8]; normals[0] = Vec2::Normalize(Vec2::Orthogonal(quad1[1] - quad1[0])); normals[1] = Vec2::Normalize(Vec2::Orthogonal(quad1[2] - quad1[1])); normals[2] = Vec2::Normalize(Vec2::Orthogonal(quad1[3] - quad1[2])); normals[3] = Vec2::Normalize(Vec2::Orthogonal(quad1[0] - quad1[3])); normals[4] = Vec2::Normalize(Vec2::Orthogonal(quad2[1] - quad2[0])); normals[5] = Vec2::Normalize(Vec2::Orthogonal(quad2[2] - quad2[1])); normals[6] = Vec2::Normalize(Vec2::Orthogonal(quad2[3] - quad2[2])); normals[7] = Vec2::Normalize(Vec2::Orthogonal(quad2[0] - quad2[3])); double minOverlap = 0.0; // Index of normal axis where the overlap is smallest int minOverlapNorm = 0; for (int i = 0; i < 8; ++i) { CollisionProjection proj1 = ProjectQuadToAxis(quad1, normals[i]); CollisionProjection proj2 = ProjectQuadToAxis(quad2, normals[i]); double overlap = TestProjectionOverlap(proj1, proj2); // No collision if there is no overlap in at least one of the axes if (overlap == 0.0) { return Vec2(0.0, 0.0); } if (minOverlap == 0.0) { minOverlap = overlap; minOverlapNorm = i; } else if (overlap < minOverlap) { minOverlap = overlap; minOverlapNorm = i; } } return normals[minOverlapNorm] * minOverlap; }
bool Collision::SeparatingAxisTheorem::TestTwoObjects(Rendering::SceneObject *obj1, Rendering::SceneObject *obj2) { std::vector<glm::vec3> axes = GetTestingAxes(obj1, obj2); // std::vector<glm::vec3> axes2 = GetTestingAxes(obj2, TODO); //axes.insert(axes.end(), axes2.begin(), axes2.end()); for (auto axis : axes) { if (!TestProjectionOverlap(GetProjection(obj1, axis), GetProjection(obj2, axis))) { return false; } } // for (auto axis : axes2) // { // if (!TestProjectionOverlap(GetProjection(obj1, axis), GetProjection(obj2, axis))) // { // return false; // } // } return true; }