public override void Initialize(NVRPlayer player) { Player = player; Player.gameObject.SetActive(false); OVRManager manager = Player.gameObject.AddComponent <OVRManager>(); manager.trackingOriginType = OVRManager.TrackingOrigin.FloorLevel; OVRCameraRig rig = Player.gameObject.AddComponent <OVRCameraRig>(); NVRHelpers.SetProperty(rig, "trackingSpace", Player.transform, true); NVRHelpers.SetProperty(rig, "leftHandAnchor", Player.LeftHand.transform, true); NVRHelpers.SetProperty(rig, "rightHandAnchor", Player.RightHand.transform, true); NVRHelpers.SetProperty(rig, "centerEyeAnchor", Player.Head.transform, true); Player.gameObject.SetActive(true); }
public override void Initialize(NVRPlayer player) { Player = player; Player.gameObject.SetActive(false); OVRManager manager = Player.gameObject.AddComponent <OVRManager>(); manager.trackingOriginType = OVRManager.TrackingOrigin.FloorLevel; // User OVR rig for two camera, per eye setup OVRCameraRig rig = Player.gameObject.AddComponent <OVRCameraRig>(); rig.usePerEyeCameras = true; NVRHelpers.SetProperty(rig, "trackingSpace", Player.transform, true); NVRHelpers.SetProperty(rig, "leftHandAnchor", Player.LeftHand.transform, true); NVRHelpers.SetProperty(rig, "rightHandAnchor", Player.RightHand.transform, true); NVRHelpers.SetProperty(rig, "centerEyeAnchor", Player.Head.transform, true); Player.gameObject.SetActive(true); // Initialize Left and Right eye cameras with components and values matching original head camera // This allows image effects, scripts, etc. set up and tested on the main camera to copy // over maintaining values to two camera setup // Reference to the NVR Head game object with desired camera components and values GameObject originalHead = Player.Head.gameObject; // Reference to left and right eye cameras created by OVR rig setup Camera _leftEyeCamera = rig.leftEyeAnchor.GetComponent <Camera>(); Camera _rightEyeCamera = rig.rightEyeAnchor.GetComponent <Camera>(); if (originalHead != null) { ///////////////////// LEFT EYE CAMERA SETUP ////////////////////////////// // Adjust clipping and target eye for stereo camera _leftEyeCamera.stereoTargetEye = StereoTargetEyeMask.Left; _leftEyeCamera.farClipPlane = 160f; _leftEyeCamera.nearClipPlane = 0.01f; // Background color setup //change to fix NewtonSubmodule link // _leftEyeCamera.clearFlags = CameraClearFlags.SolidColor; // _leftEyeCamera.backgroundColor = new Color(0.00f, 0.0f, 0.025f); // Set all layers to 1, then compare with & to change "RightEye" layer to 0 while keeping all others 1 // 1111 add 1101 get 1101 _leftEyeCamera.cullingMask = originalHead.GetComponent <Camera>().cullingMask; _leftEyeCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("RightEye")); // Copy over image effect components from the main camera tagged with "ArtSetupCamera" // to each target eye camera with reflected component values Component[] cameraComponents = originalHead.GetComponents(typeof(Component)); // Copy over each component from the head to the right eye foreach (Component curComponent in cameraComponents) { // Get component type System.Type type = curComponent.GetType(); // Skip certain components ie left eye already has Camera // component and scene only needs one AudioListener if (type != typeof(Camera) && type != typeof(Transform) && type != typeof(AudioListener)) { // Add component to right eye game object Component copy = rig.leftEyeAnchor.gameObject.AddComponent(type); // Save active status of component from head bool isActive = ((Behaviour)originalHead.GetComponent(type)).enabled; // Reflect all component values from head to right eye System.Reflection.FieldInfo[] fields = type.GetFields(); foreach (System.Reflection.FieldInfo field in fields) { field.SetValue(copy, field.GetValue(curComponent)); } // Set active status of right eye component from status of head ((Behaviour)rig.leftEyeAnchor.GetComponent(type)).enabled = isActive; } } ///////////////////// RIGHT EYE CAMERA SETUP ////////////////////////////// // Adjust clipping and target eye for stereo camera _rightEyeCamera.stereoTargetEye = StereoTargetEyeMask.Right; _rightEyeCamera.farClipPlane = 160f; _rightEyeCamera.nearClipPlane = 0.01f; // Background color setup // _rightEyeCamera.clearFlags = CameraClearFlags.SolidColor; // _rightEyeCamera.backgroundColor = new Color(0.00f, 0.0f, 0.025f); // Set all layers to 1, then compare with & to change "LeftEye" layer to 0 while keeping all others 1 // 1111 add 1101 get 1101 _rightEyeCamera.cullingMask = originalHead.GetComponent <Camera>().cullingMask; _rightEyeCamera.cullingMask &= ~(1 << LayerMask.NameToLayer("LeftEye")); _rightEyeCamera.tag = "MainCamera"; // Copy over image effect components from the main camera tagged with "ArtSetupCamera" // to each target eye camera with reflected component values // Component[] cameraComponents = originalHead.GetComponents(typeof(Component)); // Copy over each component from the head to the right eye foreach (Component curComponent in cameraComponents) { // Get component type System.Type type = curComponent.GetType(); // Skip certain components ie right eye already has Camera // component and scene only needs one AudioListener if (type != typeof(Camera) && type != typeof(Transform) && type != typeof(AudioListener)) { // Add component to right eye game object Component copy = rig.rightEyeAnchor.gameObject.AddComponent(type); // Save active status of component from head bool isActive = ((Behaviour)originalHead.GetComponent(type)).enabled; // Reflect all component values from head to right eye System.Reflection.FieldInfo[] fields = type.GetFields(); foreach (System.Reflection.FieldInfo field in fields) { field.SetValue(copy, field.GetValue(curComponent)); } // Set active status of right eye component from status of head ((Behaviour)rig.rightEyeAnchor.GetComponent(type)).enabled = isActive; } } } }