public static Vector2 RayConeDistance(GCone _cone, GRay _ray) { Vector2 distances = RayConeCalculate(_cone, _ray); if (Vector3.Dot(_cone.normal, _ray.GetPoint(distances.x) - _cone.origin) < 0) { distances.x = -1; } if (Vector3.Dot(_cone.normal, _ray.GetPoint(distances.y) - _cone.origin) < 0) { distances.y = -1; } return(distances); }
static Vector2 RayConeCalculate(GCone _cone, GRay _ray) { Vector2 distances = Vector2.one * -1; Vector3 offset = _ray.origin - _cone.origin; float RDV = Vector3.Dot(_ray.direction, _cone.normal); float ODN = Vector3.Dot(offset, _cone.normal); float cosA = Mathf.Cos(UMath.AngleToRadin(_cone.angle)); float sqrCosA = cosA * cosA; float a = RDV * RDV - sqrCosA; float b = 2f * (RDV * ODN - Vector3.Dot(_ray.direction, offset) * sqrCosA); float c = ODN * ODN - Vector3.Dot(offset, offset) * sqrCosA; float determination = b * b - 4f * a * c; if (determination < 0) { return(distances); } determination = Mathf.Sqrt(determination); distances.x = (-b + determination) / (2f * a); distances.y = (-b - determination) / (2f * a); return(distances); }