Exemplo n.º 1
0
        internal CameraState GetStateForCustomCamera(Camera camera)
        {
            var           mapTransform  = m_root.transform;
            var           savedRotation = camera.transform.rotation;
            var           savedPosition = camera.transform.position;
            DoubleVector3 finalOriginECEF;
            Matrix4x4     viewMatrixECEF;
            var           mapSpaceCameraPosition = mapTransform.InverseTransformPoint(camera.transform.position);

            if (m_coordinateSystem == CoordinateSystem.ECEF)
            {
                finalOriginECEF = m_originECEF + mapSpaceCameraPosition;

                camera.transform.position = mapTransform.position;
                viewMatrixECEF            = camera.worldToCameraMatrix * mapTransform.localToWorldMatrix;
                viewMatrixECEF.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));
            }
            else // if (m_coordinateSystem == CoordinateSystem.UnityWorld)
            {
                finalOriginECEF = m_frame.LocalSpaceToECEF(mapSpaceCameraPosition);

                var mapSpaceCameraRotation = Quaternion.Inverse(mapTransform.rotation) * camera.transform.rotation;
                camera.transform.rotation = m_frame.LocalToECEFRotation * mapSpaceCameraRotation;
                camera.transform.position = Vector3.zero;
                viewMatrixECEF            = camera.worldToCameraMatrix;
            }

            DoubleVector3 interestPointECEF = m_interestPointProvider.CalculateInterestPoint(camera, finalOriginECEF);

            camera.transform.rotation = savedRotation;
            camera.transform.position = savedPosition;

            return(new CameraState(finalOriginECEF, interestPointECEF, viewMatrixECEF, camera.projectionMatrix));
        }
Exemplo n.º 2
0
        public void StreamResourcesForCamera(UnityEngine.Camera streamingCamera)
        {
            // This code would be a lot cleaner if there was a decent way of copying camera properties around.
            // Maybe we should just make StreamResourcesForCamera ingest something more abstract
            //UnityEngine.Camera zeroBasedCameraECEF = new UnityEngine.Camera();
            //zeroBasedCameraECEF.CopyFrom(streamingCamera);
            var savedPosition = streamingCamera.transform.position;

            if (m_coordinateSystem == CoordinateSystem.ECEF)
            {
                DoubleVector3 finalOriginECEF = m_originECEF + savedPosition;
                streamingCamera.transform.position = Vector3.zero;
                DoubleVector3 interestPointECEF = m_interestPointProvider.CalculateInterestPoint(streamingCamera, finalOriginECEF);
                m_nativePluginRunner.StreamResourcesForCamera(streamingCamera, finalOriginECEF, interestPointECEF);
                m_originECEF = finalOriginECEF; // :TODO: somehow update any other scene-relative cameras - OnRecentreScene event?

                // TODO: Why are we calling UpdateTransforms() an extra time in this branch? (It's already called in Update()).
                UpdateTransforms();

                // TODO: Why aren't restoring savedPosition here?
            }
            else // if (m_coordinateSystem == CoordinateSystem.UnityWorld)
            {
                var           savedRotation   = streamingCamera.transform.rotation;
                DoubleVector3 finalOriginECEF = m_frame.LocalSpaceToECEF(savedPosition);
                streamingCamera.transform.rotation = m_frame.LocalToECEFRotation * savedRotation;
                streamingCamera.transform.position = Vector3.zero;
                DoubleVector3 interestPointECEF = m_interestPointProvider.CalculateInterestPoint(streamingCamera, finalOriginECEF);
                m_nativePluginRunner.StreamResourcesForCamera(streamingCamera, finalOriginECEF, interestPointECEF);
                streamingCamera.transform.position = savedPosition;
                streamingCamera.transform.rotation = savedRotation;
            }
        }