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)); }
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; } }