- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Licensed under the MIT License. See LICENSE in the project root for license information.
-
- using UnityEngine;
-
- namespace HoloToolkit.Unity.InputModule
- {
- /// <summary>
- /// Class for manually controlling the camera when not running on HoloLens (in editor).
- /// Attach to same main camera game object.
- /// </summary>
- public class ManualGazeControl : MonoBehaviour
- {
- public bool MouseSupported = true;
- public AxisController MouseXYRotationAxisControl;
- public AxisController MouseXYTranslationAxisControl;
- public AxisController MouseXZTranslationAxisControl;
-
- public bool KeyboardSupported = true;
- public AxisController KeyboardXYRotationAxisControl;
- public AxisController KeyboardXZRotationAxisControl;
- public AxisController KeyboardXYTranslationAxisControl;
- public AxisController KeyboardXZTranslationAxisControl;
-
- public bool JoystickSupported = false;
- public AxisController JoystickXYRotationAxisControl;
- public AxisController JoystickXYTranslationAxisControl;
- public AxisController JoystickXZTranslationAxisControl;
-
- private Vector3 lastTrackerToUnityTranslation = Vector3.zero;
- private Quaternion lastTrackerToUnityRotation = Quaternion.identity;
-
- private Transform cameraTransform;
-
- private void Awake()
- {
- if (Application.isEditor)
- {
-
- #if UNITY_2017_2_OR_NEWER
- if (UnityEngine.XR.XRDevice.isPresent)
- #else
- if (UnityEngine.VR.VRDevice.isPresent)
- #endif
- {
- Destroy(this);
- return;
- }
- }
- else
- {
- Destroy(this);
- return;
- }
-
- cameraTransform = GetComponent<Camera>().transform;
- if (cameraTransform == null)
- {
- Debug.LogError("ManualGazeControl being used on a game object without a Camera.");
- }
-
- MouseXYRotationAxisControl.enabled = MouseSupported;
- MouseXYTranslationAxisControl.enabled = MouseSupported;
- MouseXZTranslationAxisControl.enabled = MouseSupported;
-
- KeyboardXYRotationAxisControl.enabled = KeyboardSupported;
- KeyboardXZRotationAxisControl.enabled = KeyboardSupported;
- KeyboardXYTranslationAxisControl.enabled = KeyboardSupported;
- KeyboardXZTranslationAxisControl.enabled = KeyboardSupported;
-
- JoystickXYRotationAxisControl.enabled = JoystickSupported;
- JoystickXYTranslationAxisControl.enabled = JoystickSupported;
- JoystickXZTranslationAxisControl.enabled = JoystickSupported;
- }
-
- private void Update()
- {
- // Undo the last tracker to Unity transforms applied.
- cameraTransform.Translate(-this.lastTrackerToUnityTranslation, Space.World);
- cameraTransform.Rotate(-this.lastTrackerToUnityRotation.eulerAngles, Space.World);
-
- // Undo the last local Z-axis tilt rotation.
- float previousZTilt = this.transform.localEulerAngles.z;
- cameraTransform.Rotate(0, 0, -previousZTilt, Space.Self);
-
- // Calculate and apply the camera control movement this frame
- Vector3 rotate = Vector3.zero;
- Vector3 translate = Vector3.zero;
-
- if (MouseSupported)
- {
- Vector3 mouseXYRotate = MouseXYRotationAxisControl.GetDisplacementVector3();
- Vector3 mouseXYTranslate = MouseXYTranslationAxisControl.GetDisplacementVector3();
- Vector3 mouseXZTranslate = MouseXZTranslationAxisControl.GetDisplacementVector3();
- rotate += mouseXYRotate;
- translate += mouseXYTranslate;
- translate += mouseXZTranslate;
- }
-
- if (KeyboardSupported)
- {
- Vector3 keyboardXYRotate = KeyboardXYRotationAxisControl.GetDisplacementVector3();
- Vector3 keyboardXZRotate = KeyboardXZRotationAxisControl.GetDisplacementVector3();
- Vector3 keyboardXYTranslate = KeyboardXYTranslationAxisControl.GetDisplacementVector3();
- Vector3 keyboardXZTranslate = KeyboardXZTranslationAxisControl.GetDisplacementVector3();
- rotate += keyboardXYRotate;
- rotate += keyboardXZRotate;
- translate += keyboardXYTranslate;
- translate += keyboardXZTranslate;
- }
-
- if (JoystickSupported)
- {
- Vector3 joystickXYRotate = JoystickXYRotationAxisControl.GetDisplacementVector3();
- Vector3 joystickXYTranslate = JoystickXYTranslationAxisControl.GetDisplacementVector3();
- Vector3 joystickXZTranslate = JoystickXZTranslationAxisControl.GetDisplacementVector3();
- rotate += joystickXYRotate;
- translate += joystickXYTranslate;
- translate += joystickXZTranslate;
- }
-
- rotate *= Mathf.Rad2Deg; // change to degrees for the Rotate function
-
- // Now apply the displacements to the camera
- cameraTransform.Rotate(rotate.x, 0.0f, 0.0f, Space.Self);
- cameraTransform.Rotate(0.0f, rotate.y, 0.0f, Space.World);
- cameraTransform.Translate(translate, Space.Self);
-
- // Apply updated local Z-axis tilt rotation.
- cameraTransform.Rotate(0.0f, 0.0f, rotate.z + previousZTilt, Space.Self);
-
- // Re-apply the last tracker to Unity transform.
- cameraTransform.Rotate(this.lastTrackerToUnityRotation.eulerAngles, Space.World);
- cameraTransform.Translate(this.lastTrackerToUnityTranslation, Space.World);
- }
- }
- }