/*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); }
public static HullCollision2D detectCollisionResponse(AABBHull2D a, AABBHull2D b) { Dictionary <Vector2, float> axisValues = new Dictionary <Vector2, float>(); //norm to the overlap value axisValues.Add(Vector2.up, checkAxisPenetration(a, b, Vector2.up)); axisValues.Add(Vector2.right, checkAxisPenetration(a, b, Vector2.right)); Dictionary <Vector2, float> .Enumerator enumerator = axisValues.GetEnumerator(); enumerator.MoveNext(); KeyValuePair <Vector2, float> bestPenetration = enumerator.Current; //need to set one to compare too, no null value to just allow all checking in the for loop if (bestPenetration.Value == 0.0f) { return(null); } while (enumerator.MoveNext()) { if (Mathf.Abs(enumerator.Current.Value) < Mathf.Abs(bestPenetration.Value)) { bestPenetration = enumerator.Current; } if (bestPenetration.Value == 0.0f) { return(null); } } HullCollision2D collision; collision = new HullCollision2D(a, b, bestPenetration.Key, Mathf.Abs(bestPenetration.Value)); return(collision); }
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 }
void FixedUpdate() { for (int i = 0; i < mPhysicsObjects.Count; i++) { for (int j = i + 1; j < mPhysicsObjects.Count; j++) { //bool coll = mPhysicsObjects[i].detectCollision(mPhysicsObjects[j]); HullCollision2D collision = mPhysicsObjects[i].detectCollisionResponse(mPhysicsObjects[j]); if (collision != null) { collision.a.OnCollision(collision.b); //info is still valid before resolved called collision.b.OnCollision(collision.a); collision.Resolve(Time.fixedDeltaTime); } } } }
public static HullCollision2D detectCollisionResponse(OBBHull2D a, OBBHull2D b) { Dictionary <Vector2, float> axisValues = new Dictionary <Vector2, float>(); //norm to the overlap value axisValues.Add(a.getXNormal(), checkAxisPenetration(a, b, a.getXNormal())); axisValues.Add(a.getYNormal(), checkAxisPenetration(a, b, a.getYNormal())); if (a.rotation != b.rotation) { axisValues.Add(b.getXNormal(), checkAxisPenetration(a, b, b.getXNormal())); axisValues.Add(b.getYNormal(), checkAxisPenetration(a, b, b.getYNormal())); } Dictionary <Vector2, float> .Enumerator enumerator = axisValues.GetEnumerator(); enumerator.MoveNext(); Vector2 pos = a.position; KeyValuePair <Vector2, float> bestPenetration = enumerator.Current; //need to set one to compare too, no null value to just allow all checking in the for loop if (bestPenetration.Value == 0.0f) { return(null); } while (enumerator.MoveNext()) { if (Mathf.Abs(enumerator.Current.Value) < Mathf.Abs(bestPenetration.Value)) { bestPenetration = enumerator.Current; } if (bestPenetration.Value == 0.0f) { return(null); } } HullCollision2D collision; Vector2 norm = bestPenetration.Key; if (bestPenetration.Value <= 0.0f) //ooh this was an easy thing to miss { norm *= -1.0f; } collision = new HullCollision2D(a, b, norm, Mathf.Abs(bestPenetration.Value)); //collision.contactPoint = pos; return(collision); }
//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); }