public static bool Raycast(FPVector rayOrigin, FPVector rayDirection, out FPRaycastHit hit, FP maxDistance, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) { FPRay ray = new FPRay(rayOrigin, direction: rayDirection); hit = PhysicsWorldManager.instance.Raycast(ray, maxDistance, layerMask: layerMask); if (hit != null) { if (hit.distance <= maxDistance) { return(true); } } return(false); }
public static FPQuaternion Lerp(FPQuaternion a, FPQuaternion b, FP t) { t = FPMath.Clamp(t, FP.Zero, FP.One); return(LerpUnclamped(a, b, t)); }
public static FPQuaternion RotateTowards(FPQuaternion from, FPQuaternion to, FP maxDegreesDelta) { FP dot = Dot(from, to); if (dot < 0.0f) { to = Multiply(to, -1); dot = -dot; } FP halfTheta = FP.Acos(dot); FP theta = halfTheta * 2; maxDegreesDelta *= FP.Deg2Rad; if (maxDegreesDelta >= theta) { return(to); } maxDegreesDelta /= theta; return(Multiply(Multiply(from, FP.Sin((1 - maxDegreesDelta) * halfTheta)) + Multiply(to, FP.Sin(maxDegreesDelta * halfTheta)), 1 / FP.Sin(halfTheta))); }
public static FPQuaternion Inverse(FPQuaternion rotation) { FP invNorm = FP.One / ((rotation.x * rotation.x) + (rotation.y * rotation.y) + (rotation.z * rotation.z) + (rotation.w * rotation.w)); return(FPQuaternion.Multiply(FPQuaternion.Conjugate(rotation), invNorm)); }
public static FPQuaternion Slerp(FPQuaternion from, FPQuaternion to, FP t) { t = FPMath.Clamp(t, 0, 1); FP dot = Dot(from, to); if (dot < 0.0f) { to = Multiply(to, -1); dot = -dot; } FP halfTheta = FP.Acos(dot); return(Multiply(Multiply(from, FP.Sin((1 - t) * halfTheta)) + Multiply(to, FP.Sin(t * halfTheta)), 1 / FP.Sin(halfTheta))); }