/*WORKING*/ public static HullCollision2D detectCollisionResponse(CircleHull2D circle, AABBHull2D square) { float dist = Vector2.Distance(circle.position, square.GetClosestPoint(circle.position)); Vector2 squareClosestPoint = square.GetClosestPoint(circle.position); Vector2 circleClosestPoint = circle.GetClosestPoint(squareClosestPoint); //need to do second Debug.DrawLine(squareClosestPoint, circleClosestPoint); if (circle.radius > dist) { Vector2 pen = squareClosestPoint - circleClosestPoint; Vector2 penNorm = pen.normalized; if (penNorm.x > penNorm.y) { pen.y = 0.0f; } else { pen.x = 0.0f; } HullCollision2D collision; collision = new HullCollision2D(circle, square, penNorm.normalized, pen.magnitude); return(collision); } return(null); }
/* * Circle V Circle */ public static bool detectCollision(CircleHull2D a, CircleHull2D b) { if (a.radius + b.radius >= Vector2.Distance(a.position, b.position)) { return(true); } return(false);//failed }
public static Vector2 getMinMaxProjectionValuesOnNorm(CircleHull2D circle, Vector2 norm) { float a, b; int axis = norm.x != 0 ? 0 : 1; //just to make a scaler, but in case the x axis is zero, and if they are both zero then what the hell u doing with a normal (0,0) a = (proj(circle.position, norm)[axis] - circle.radius) / norm[axis]; b = (proj(circle.position, norm)[axis] + circle.radius) / norm[axis]; return(new Vector2(a, b)); }
/* * Circle V OBB */ public static bool detectCollision(CircleHull2D circle, OBBHull2D square) { Vector2 closestPoint = square.GetClosestPoint(circle.position); Debug.DrawLine(new Vector3(closestPoint.x, closestPoint.y, 0), circle.position); if (circle.radius > Vector2.Distance(circle.position, closestPoint)) { return(true); } return(false); }
public static HullCollision2D detectCollisionResponse(CircleHull2D a, CircleHull2D b) { float dist = Vector2.Distance(a.position, b.position); if (a.radius + b.radius > dist) { Vector2 penetration = (a.position - b.position).normalized; float penAmount = (a.radius + b.radius) - Vector2.Distance(a.position, b.position); HullCollision2D collision = new HullCollision2D(a, b, penetration, penAmount); //collision.closingVelocity = -(lft.velocity - rgt.velocity) *(lft.velocity - rgt.velocity).normalized; return(collision); } return(null);//failed }
//TODO public static HullCollision2D detectCollisionResponse(CircleHull2D circle, OBBHull2D square) { Vector2 closestPointSquare = square.GetClosestPoint(circle.position); Vector2 closestPointCircle = circle.GetClosestPoint(closestPointSquare); Debug.DrawLine(new Vector3(closestPointSquare.x, closestPointSquare.y, 0), new Vector3(closestPointCircle.x, closestPointCircle.y, 0)); if (circle.radius > Vector2.Distance(circle.position, closestPointSquare)) { Vector2 penNorm = closestPointSquare - closestPointCircle; HullCollision2D collision; if (penNorm.x > 0.0f) { collision = new HullCollision2D(circle, square, penNorm.normalized, penNorm.magnitude); } else { collision = new HullCollision2D(circle, square, penNorm.normalized, penNorm.magnitude); } return(collision); } return(null); }
public abstract bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c);
public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c) { return(circle.TestCollisionVsOBB(this, ref c)); }
public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c) { //Call circle, flip arguments <=== ///What does this mean\\\? return(circle.TestCollisionVsAABB(this, ref c)); }
public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision col) { //Collision test passes if(distance between them <= sum of radii) //Optimize: by ^2 both sides //1) Get particles' positions(centers) //2) Take difference between centers //3) distance^2 = dot(diff, diff) //4) summ of radii //5) summ of radii ^2 //6) Test: dist^2 <= summ^2 Debug.Log("CVC test start"); Vector2 positionA = circle.transform.position; Vector2 positionB = this.transform.position; Vector2 diff = positionB - positionA; float distance = (diff.x * diff.x) + (diff.y * diff.y); //distance squared float sumOfRadii = radius + circle.radius; float squaredSumOfRadii = sumOfRadii * sumOfRadii; if (distance <= squaredSumOfRadii) { Debug.Log("CVC test pass"); hitExplode = true; //Assign objects col.a = this; col.b = circle; //Calculate contact normal - is also the contact direction distance = Mathf.Sqrt(distance); col.contacts[0].normal = diff * (1 / distance); //Calculate contact point => center of the overlap //take the diff //magnitude = distance //normalise by /magnitude Vector2 e0 = col.contacts[0].normal * -radius; Vector2 e1 = col.contacts[0].normal * circle.radius; col.contacts[0].point = (e0 + e1) * 0.5f; //Calculate interpenetration depth //subtract distance from sum of radii => interpen depth col.interpenDepth = sumOfRadii - distance; return(true); } else { Debug.Log("CVC test fail"); return(false); } }