Mercurial > hg > Game > Games
diff Orchestland/Assets/LeapMotion+OVR/Scripts/LeapCameraAlignment.cs @ 1:f7675884f2a1
Add Orchestland project
author | Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:09:20 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orchestland/Assets/LeapMotion+OVR/Scripts/LeapCameraAlignment.cs Fri Jul 17 23:09:20 2015 +0900 @@ -0,0 +1,51 @@ +using UnityEngine; +using System.Collections; + +public class LeapCameraAlignment : MonoBehaviour { + public HandController handController; + public Transform leftEye; + public Transform centerEye; + public Transform rightEye; + + [HideInInspector] + public float tween = 1.0f; + + // IMPORTANT: This method MUST be called after + // OVRManager.LateUpdate + // NOTE: Call order is determined by enabling... + // Use ExecutionOrdering script to ensure correct call order + void LateUpdate() { + if (handController == null || + leftEye == null || + rightEye == null) { + Debug.Log ("Hand Controller & Eye references cannot be null"); + return; + } + + if (HasNaN (leftEye.position) || + HasNaN (centerEye.position) || + HasNaN (rightEye.position)) + // Uninitialized transforms + return; + + // ASSUME: Oculus resets camera positions in each frame + Vector3 oculusIPD = rightEye.position - leftEye.position; + if (oculusIPD.magnitude < float.Epsilon) + // Unmodified camera positions + return; + + LeapDeviceInfo device = handController.GetDeviceInfo (); + if (device.type == LeapDeviceType.Invalid) + return; + + Vector3 addIPD = 0.5f * oculusIPD.normalized * (device.baseline - oculusIPD.magnitude) * tween; + Vector3 toDevice = centerEye.forward * device.focalPlaneOffset * tween; + leftEye.position = leftEye.position - addIPD + toDevice; + rightEye.position = rightEye.position + addIPD + toDevice; + centerEye.position = 0.5f * (leftEye.position + rightEye.position); + } + + bool HasNaN(Vector3 v) { + return float.IsNaN (v.x) || float.IsNaN (v.y) || float.IsNaN (v.z); + } +}