public static double RaycastDistance(Tuple3 position, Tuple3 direction, ReferenceFrame referenceFrame) { if (ReferenceEquals(referenceFrame, null)) { throw new ArgumentNullException(nameof(referenceFrame)); } var worldPosition = referenceFrame.PositionToWorldSpace(position.ToVector()); var worldDirection = referenceFrame.DirectionToWorldSpace(direction.ToVector()); RaycastHit hitInfo; bool hit = Physics.Raycast(worldPosition, worldDirection, out hitInfo); return(hit ? hitInfo.distance : Double.PositiveInfinity); }
public static Parts.Part RaycastPart(Tuple3 position, Tuple3 direction, ReferenceFrame referenceFrame) { if (ReferenceEquals(referenceFrame, null)) { throw new ArgumentNullException(nameof(referenceFrame)); } var worldPosition = referenceFrame.PositionToWorldSpace(position.ToVector()); var worldDirection = referenceFrame.DirectionToWorldSpace(direction.ToVector()); RaycastHit hitInfo; bool hit = Physics.Raycast(worldPosition, worldDirection, out hitInfo); if (!hit) { return(null); } var part = hitInfo.collider.gameObject.GetComponentInParent <global::Part>(); return(part == null ? null : new Parts.Part(part)); }
public static Tuple3 TransformDirection(Tuple3 direction, ReferenceFrame from, ReferenceFrame to) { CheckReferenceFrames(from, to); return(to.DirectionFromWorldSpace(from.DirectionToWorldSpace(direction.ToVector())).ToTuple()); }