コード例 #1
0
ファイル: AABB2D.cpp プロジェクト: Sethix/GameEngine
	bool	iTest		(const AABB2D &ac, const Ray2D &bc)
	{
		assert(bc.direction[0] + bc.direction[1] != 0);

		Ray2D ray = bc;

		for (int i = 0; i < 2; ++i)
			ray.direction[i] = (ray.direction[i] == 0) ? FLT_EPSILON : ray.direction[i];

		Plane2D planes[4];

		planes[0] = { Vector2{ ac.min.x  , ac.pos().y },Vector2{ -1, 0 } };
		planes[1] = { Vector2{ ac.pos().x, ac.min.y   },Vector2{  0,-1 } };
		planes[2] = { Vector2{ ac.max.x  , ac.pos().y },Vector2{  1, 0 } };
		planes[3] = { Vector2{ ac.pos().x, ac.max.y   },Vector2{  0, 1 } };

		float dists[4];

		float tmin = FLT_MAX;
		float tmax = -FLT_MAX;

		for (int i = 0; i < 4; ++i)
		{
			float deno = -(dot(planes[i].normal, ray.direction));

			dists[i] = dot(planes[i].normal, (ray.position - planes[i].position)) / deno;
		}

		tmin = fmaxf(fminf(dists[0], dists[2]), fminf(dists[1], dists[3]));
		tmax = fminf(fmaxf(dists[0], dists[2]), fmaxf(dists[1], dists[3]));

		return tmin <= tmax && 0 <= tmin <= bc.length;
	}
コード例 #2
0
ファイル: AABB2D.cpp プロジェクト: Sethix/GameEngine
	CollisionData iTest_data(const AABB2D &ac, const Plane2D &bc)
	{
		if (iTest(ac, bc))
		{
			CollisionData r;
			r.collisionNormal = bc.normal;
			r.penDepth = dot(bc.normal, (ac.pos() - bc.position));
			if (r.penDepth < 0) r.penDepth = 0;
			return r;
		}
		else return CollisionData{ 0,0 };
	}
コード例 #3
0
ファイル: AABB2D.cpp プロジェクト: Sethix/GameEngine
	bool	iTest		(const AABB2D &ac, const Plane2D &bc)
	{
		return dot(bc.normal, (ac.pos() - bc.position)) <= 
				  (ac.dim().x / 2) * dot(bc.normal, Vector2{ 1,0 }) 
				+ (ac.dim().y / 2) * dot(bc.normal, Vector2{ 0,1 });
	}