예제 #1
0
        void Awake()
        {
            var ecefPoint = LatLong.FromDegrees(InitialLatitude, InitialLongitude).ToECEF();
            var heading   = InitialHeadingInDegrees;

            TangentBasis = EcefHelpers.EcefTangentBasisFromPointAndHeading(ecefPoint, heading);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
 /// <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);
 }