void Awake() { var ecefPoint = LatLong.FromDegrees(InitialLatitude, InitialLongitude).ToECEF(); var heading = InitialHeadingInDegrees; TangentBasis = EcefHelpers.EcefTangentBasisFromPointAndHeading(ecefPoint, heading); }
public static void CalculateLookAt( DoubleVector3 interestPointEcef, Vector3 interestBasisFoward, float pitchRadians, float distanceCameraToInterest, out DoubleVector3 cameraLocation, out Vector3 cameraDirection, out Vector3 cameraUp) { var interestBasis = new EcefTangentBasis(interestPointEcef, interestBasisFoward); var q = Quaternion.AngleAxis(pitchRadians * Mathf.Rad2Deg, interestBasis.Right); cameraDirection = q.RotatePoint(interestBasis.Forward); var toCamera = -cameraDirection * distanceCameraToInterest; cameraLocation = interestBasis.PointEcef + new DoubleVector3(toCamera.x, toCamera.y, toCamera.z); cameraUp = Vector3.Cross(cameraDirection, interestBasis.Right); }
internal void ApplyNativeCameraState(NativeCameraState nativeCameraState, UnityEngine.Camera controlledCamera) { controlledCamera.fieldOfView = nativeCameraState.fieldOfViewDegrees; controlledCamera.nearClipPlane = nativeCameraState.nearClipPlaneDistance; controlledCamera.farClipPlane = nativeCameraState.farClipPlaneDistance; var interestBasis = new EcefTangentBasis( nativeCameraState.interestPointECEF, nativeCameraState.interestBasisRightECEF, nativeCameraState.interestBasisUpECEF, nativeCameraState.interestBasisForwardECEF); Vector3 forward, up; DoubleVector3 positionECEF; CameraHelpers.CalculateLookAt( interestBasis.PointEcef, interestBasis.Forward, nativeCameraState.pitchDegrees * Mathf.Deg2Rad, nativeCameraState.distanceToInterestPoint, out positionECEF, out forward, out up); m_interestPointProvider.UpdateFromNative(nativeCameraState.interestPointECEF); if (m_coordinateSystem == CoordinateSystem.ECEF) { var position = (positionECEF - m_originECEF).ToSingleVector(); controlledCamera.transform.position = position; controlledCamera.transform.LookAt((interestBasis.PointEcef - m_originECEF).ToSingleVector(), up); } else // if (m_coordinateSystem == CoordinateSystem.UnityWorld) { controlledCamera.transform.position = m_frame.ECEFToLocalSpace(positionECEF); controlledCamera.transform.LookAt(m_frame.ECEFToLocalSpace(interestBasis.PointEcef), m_frame.ECEFToLocalRotation * up); } }
/// <summary> /// Set the heading in degrees of this transform, relative to north. /// </summary> /// <param name="headingInDegrees">The new heading of the transform.</param> public void SetHeading(float headingInDegrees) { m_tangentBasis = EcefHelpers.EcefTangentBasisFromPointAndHeading(m_tangentBasis.PointEcef, headingInDegrees); }