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);
        }
Example #2
0
        //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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }