在某些HTC VIVE控制器角度打开GUI /转动

时间:2017-01-07 09:48:40

标签: c# unity3d unity5 virtual-reality htc-vive

我正在尝试为HTC VIVE制作一个GUI,但在某个控制器角度上打开它时遇到了麻烦。

我做了一些工作,并且做了一点粗略的因为我的对象是一个孩子,这使我很难跟踪它的旋转或位置,因为我希望它只在控制器处于特定角度时打开(作为一个人看着他的手表)

这是一些视觉示例:

这是我没有GUI的控制器旋转: Normal GUI closed

当我旋转控制器时,GUI应显示如下内容: at angle (as a guy looking at his watch) GUI Open

以下是我管理的一些代码

   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();

                        }
                }
            }
        }

    }

我不知道做这种任务是正确的方法吗? 以简单的方式,我想在某些控制器旋转上显示GUI。

这是我所说的层次结构

This is My hierarchy

我想用我的GUI做同样的事情,当我的手角度像这个图像时,它应该打开 enter image description here

1 个答案:

答案 0 :(得分:1)

有一个简单的解决方案来处理UI旋转。

我想你的GUI有一个画布。此画布可以是任何对象的子画面。如果您将画布(此菜单的根)添加为左手的子画面,则应使用左手移动和旋转。

请注意,画布的渲染模式必须为UIGestureRecognizerStateEnded

这是父母(左手):

enter image description here

正确设置canvas的rect变换值(最重要的部分是pos.z,我改变了画布的比例而不是改变z。我可以改变画布的宽度和高度但是会产生不利影响)

enter image description here

它将按照您在旋转父对象时所描述的行为(左手):

enter image description here

修改

将此脚本添加到相机

World Space

将gui菜单指定给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); } } }

将左手分配到menuGUI

您还可以在menuGUI旋转中包含手的旋转元素:

hand

我还没有对此进行测试,但menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x, hand.transform.eulerAngles.y, hand.transform.eulerAngles.z); 也应该正常运行。

如下所示,当在相机前方看到画布时,相机和画布的rotation.eulerAngles.x相同

enter image description here

enter image description here