#if VRTK_DEFINE_SDK_DAYDREAM namespace VRTK { using UnityEngine; /// /// DaydreamReach component uses touchpad to extend controller position out in front of user /// along the current controller orientation plane /// public class DaydreamReach : MonoBehaviour { [Tooltip("Controller to track, defaults to ./Controller but probably want a Pointer Joint like GvrControllerPointer/Laser")] public Transform controller; [Tooltip("Maximum reach distance from controller origin.")] public float reachDistance = 0.5f; private Vector3 positionOrigin; protected virtual void Start() { if (controller == null) { controller = transform.Find("Controller"); } positionOrigin = transform.position; } protected virtual void Update() { if (!GvrController.IsTouching) { // snap back to origin transform.position = positionOrigin; } else { transform.position = ReachForwardByDistance(); } } private Vector3 ReachForwardByDistance() { Vector3 pos = positionOrigin; Vector3 offset = Vector3.zero; Vector2 touch = GetTouch(5); offset.z = touch.y * reachDistance; offset = controller.transform.rotation * offset; pos += offset; return pos; } /// /// GetTouch gets touch position adjusted coordinates. Abs(x) and abs(y) always 0 to 1 /// /// like a numeric keypad, 1= lower left, 2=lower-center, 5=center etc /// A Vector2 of the touch position. private Vector2 GetTouch(int origin = 5) { if (!GvrController.IsTouching) { return Vector2.zero; } Vector2 touch = GvrController.TouchPos; // raw: 0,0 is top left, x is left-right, y is front-back // invert y axis touch.y = 1.0f - touch.y; switch (origin) { case 1: break; case 2: touch.x = touch.x * 2f - 1f; break; case 5: touch.y = touch.y * 2f - 1f; touch.x = touch.x * 2f - 1f; break; } return touch; } } } #endif