public static bool ColliderCast(SphereCollider sphereToCast, RigidTransform castStart, float3 castEnd, BoxCollider targetBox, RigidTransform targetBoxTransform, out ColliderCastResult result) { var start = math.transform(castStart, sphereToCast.center); var casterInTargetSpace = math.mul(math.inverse(targetBoxTransform), castStart); var ray = new Ray(math.transform(casterInTargetSpace, start), math.transform(casterInTargetSpace, start + castEnd - castStart.pos)); bool hit = Raycasting.RaycastRoundedBox(ray, targetBox, sphereToCast.radius, out var fraction, out var normal); if (hit) { var hitTransform = castStart; hitTransform.pos = math.lerp(castStart.pos, castEnd, fraction); DistanceBetween(sphereToCast, hitTransform, targetBox, targetBoxTransform, 1f, out var distanceResult); result = new ColliderCastResult { hitpointOnCaster = distanceResult.hitpointA, hitpointOnTarget = distanceResult.hitpointB, normalOnSweep = distanceResult.normalA, normalOnTarget = distanceResult.normalB, subColliderIndexOnCaster = distanceResult.subColliderIndexA, subColliderIndexOnTarget = distanceResult.subColliderIndexB, distance = math.distance(hitTransform.pos, castStart.pos) }; return(true); } result = default; return(false); }
//Todo: No need to apply rotation to ray for sphere. public static bool Raycast(Ray ray, SphereCollider sphere, RigidTransform sphereTransform, out RaycastResult result) { var rayInSphereSpace = Ray.TransformRay(math.inverse(sphereTransform), ray); bool hit = Raycasting.RaycastSphere(rayInSphereSpace, sphere, out float fraction, out float3 normal); result.position = math.lerp(ray.start, ray.end, fraction); result.normal = math.rotate(sphereTransform, normal); result.distance = math.distance(ray.start, result.position); return(hit); }
public static bool Raycast(Ray ray, BoxCollider box, RigidTransform boxTransform, out RaycastResult result) { var rayInBoxSpace = Ray.TransformRay(math.inverse(boxTransform), ray); bool hit = Raycasting.RaycastBox(rayInBoxSpace, box, out float fraction, out float3 normal); result.position = math.lerp(ray.start, ray.end, fraction); result.normal = math.rotate(boxTransform, normal); result.distance = math.distance(ray.start, result.position); return(hit); }
public static bool Raycast(Ray ray, CapsuleCollider capsule, RigidTransform capsuleTransform, out RaycastResult result) { var rayInCapsuleSpace = Ray.TransformRay(math.inverse(capsuleTransform), ray); bool hit = Raycasting.RaycastCapsule(rayInCapsuleSpace, capsule, out float fraction, out float3 normal); result.position = math.lerp(ray.start, ray.end, fraction); result.normal = math.rotate(capsuleTransform, normal); result.distance = math.distance(ray.start, result.position); result.subColliderIndex = 0; return(hit); }