Example #1
0
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;
}
Example #2
0
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;
}