c# - 在某些 HTC VIVE Controller 上打开 GUI Angle/Turn

标签 c# unity3d virtual-reality htc-vive

我正在尝试为 HTC VIVE 制作图形用户界面,但在某些 Controller 角度打开它时遇到问题。

我做了一些工作并取得了一些粗略的成果,因为我的对象是一个 child ,这让我很难跟踪它的旋转或位置,因为我希望它只在 Controller 处于特定角度时打开(作为一个人看着他的 watch )

这是一些视觉示例:

这是我没有 GUI 的 Controller 旋转: Normal GUI closed

当我旋转 Controller 时,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();

                        }
                }
            }
        }

    }

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

这就是我所说的层次结构

This is My hierarchy

这和我想用我的 GUI 做的一样,当我的手的角度类似于这个图像时它应该打开 enter image description here

最佳答案

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

我想您有一个用于 GUI 的 Canvas 。此 Canvas 可以是任何对象的子对象。如果您将 Canvas (此菜单的根)添加为左手的子项,它应该用左手移动和旋转。

注意 Canvas 的渲染模式必须是World Space

这是父级(左手):

enter image description here

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

enter image description here

当旋转父对象(左手)时,它将像您描述的那样运行:

enter image description here

编辑

将此脚本添加到您的相机

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

将 gui 菜单分配给 menuGUI

将左手分配给hand

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

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

我还没有对此进行测试,但 menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, 0); 应该也能正常工作。

正如您在下面看到的,当 Canvas 就在相机前面时,相机和 Canvas 的 rotation.eulerAngles.x 是相同的

enter image description here

enter image description here

关于c# - 在某些 HTC VIVE Controller 上打开 GUI Angle/Turn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41520074/

相关文章:

c# - 眼珠Go : Picking up/Moving object

C# 为什么我不应该使用协程?

c# - 如何使用 Google 的探戈示例让 AR 示例为 Unity 运行

virtual-reality - A-Frame 物理系统 : custom physics materials

c# - 使用 VideoPlayer 播放 360 度立体视频

c# - 嵌套 For 循环 - 在 Unity 中生成卡坦风格的六角网格

c# - 删除选择器 XAMARIN 中的行

c# - 如何从 CustomControl 内部找到 CustomControl 的父级

c# - 如何使用 ValidateInput(false) 装饰 web api 中的操作

c# - 防止点击事件传播到父元素 xaml