- Home /
Question by
gumboots · Sep 03, 2015 at 02:19 AM ·
physics2dmathsphysics2d.raycastcircles
Find the Opposite Side of a CircleCollider2D
Hi there,
I'm trying to find the 'exit' point of a Physics2D.Raycast through a CircleCollider2D:
So right now I'm trying to calculate the angle to the center from hit.point, and then reflect than back out to the exit, but it's bearing no fruit.
Here's what I've got currently, any help is thoroughly appreciated!
public void HandleCircleHit(RaycastHit2D hit, Vector2 direction) {
Vector2 directionToCenter = hit.collider.transform.position - (Vector3)hit.point;
float angle = Vector2.Angle(direction, directionToCenter);
Vector3 cross = Vector3.Cross(direction, directionToCenter);
angle *= cross.z < 0 ? 1 : -1;
float centerAngle = 180 - Mathf.Abs(angle + angle);
float directionModifier = angle < 0 ? -1 : 1;
Vector2 directionToOtherEdge = Quaternion.Euler(0, 0, centerAngle * directionModifier) * directionToCenter;
Vector2 edgePosition = (Vector2)hit.collider.transform.position + (directionToOtherEdge.normalized * (hit.collider as CircleCollider2D).radius);
Debug.DrawLine(hit.point, hit.collider.transform.position, Color.red, 3f);
Debug.DrawLine(hit.collider.transform.position, edgePosition, Color.red, 3f);
}
Comment
Best Answer
Answer by gumboots · Sep 03, 2015 at 02:58 AM
I've solved this using the code below, though I'm interested to know if there's an existing way to do this!
/// <summary>Returns the point on <paramref name="circleCollider"/> where a line travelling in <paramref name="direction"/> through <paramref name="entryPoint"/> will exit.</summary>
public static Vector2 GetRayExitThroughCircle(CircleCollider2D circleCollider, Vector2 entryPoint, Vector2 direction) {
Vector2 colliderCenter = circleCollider.transform.position;
Vector2 directionToCenter = colliderCenter - entryPoint;
float angleTowardsCenter = Vector2.Angle(direction, directionToCenter);
float angleTowardsExitPoint = 180 - (angleTowardsCenter + angleTowardsCenter); // Angles inside a triangle add to 180
if (Vector3.Cross(direction, directionToCenter).z < 0) {
angleTowardsExitPoint *= -1;
}
Vector2 directionToExitPoint = Quaternion.Euler(0, 0, angleTowardsExitPoint) * directionToCenter;
Vector2 exitPoint = colliderCenter + (-directionToExitPoint.normalized * circleCollider.radius);
return exitPoint;
}