Open GUI on Certain HTC VIVE Controller Angle/Turn

534 Views Asked by At

I am Trying to make a GUI for HTC VIVE but having trouble in opening it on certain controller angle.

I have done some work and achieved a bit sketchy one because my object is a child which make it hard for me to track its rotation or position, as i wanted it to open only when controller is at certain angle (as a guy looking at his watch)

Here is some visual Example:

This is my controller rotation without GUI: Normal GUI closed

As i rotate the controller the GUI should show something like this: at angle (as a guy looking at his watch) GUI Open

Here is some code I have managed

   void RayCastFromHead() // is just a  name for Method i am raycasting from a dummy which contains left Grip button
    {
        if (Physics.Raycast(dummy.position, dummy.up, out hitInfo, 30))
        {
             transform.rotation.ToAngleAxis(out tempAngle, out tempAxis);

            if (hitInfo.collider.name.Contains("Camera (eye)"))
            {
                if (dummy.gameObject.GetComponent<MeshRenderer>().enabled)
                {
                        if ((transform.localEulerAngles.z > 270.0f && transform.localEulerAngles.z < 315.0f)&&
                            (transform.position.y > 0.9f && transform.position.y < 2f))

                        {
                            staticRotaion = transform.localRotation;
                            canvasOnHead.GetComponent<TweenScale>().PlayForward();

                        }
                }
            }
        }

    }

I do not know that it is a right method to do this kind of task? In Simple manner i want to show GUI on certain controller rotation.

This is My hierarchy what i am talking about

This is My hierarchy

This is the same i wanna do with my GUI it should open when my hand angle is something like this image enter image description here

1

There are 1 best solutions below

6
On

There is a simple solution to handle UI rotation.

I suppose you have a canvas for your GUI. This canvas can be child of any object. If you add the canvas (root of this menu) as a child of the left hand it should move and rotate with the left hand.

Note that the render mode of the canvas must be World Space.

This is the parent (left hand):

enter image description here

set the values of canvas's rect transform correctly (most important part is pos.z, I changed the scale of the canvas instead of changing the z. I could change width and height of canvas but it would have adverse effects)

enter image description here

it will behave as you described when rotating the parent object (left hand):

enter image description here

Edit

Add this script to your camera

public class LookAtWatchController : MonoBehaviour
{
    public GameObject menuGUI;
    public GameObject hand;
    void Update(){
          if(transform.eulerAngles.x > 10)
          {
                menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, 0);
                menuGUI.SetActive(true);
                menuGUI.transform.position = hand.transform.position;
          }
          else{
                menuGUI.SetActive(false);
          }
     }
}

assign the gui menu to menuGUI

assign the left hand to hand

you can also include the rotation elements of the hand in the menuGUI rotation:

menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x, hand.transform.eulerAngles.y, hand.transform.eulerAngles.z);

I haven't tested this yet but menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, 0); should also work fine.

As you see below the rotation.eulerAngles.x of camera and canvas are the same when canvas is seen right in front of camera

enter image description here

enter image description here