我正在尝试为HTC VIVE制作一个GUI,但是在某个控制器角度打开它时遇到了麻烦.
我已经完成了一些工作并且有点粗略,因为我的对象是一个孩子,这让我很难跟踪它的旋转或位置,因为我希望它只在控制器处于特定角度时打开(作为一个看着他的人)看)
这是一些视觉示例:
这是我管理的一些代码
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.
这是我所说的层次结构
解决方法
有一个简单的解决方案来处理UI旋转.
我想你的GUI有一个画布.此画布可以是任何对象的子画面.如果您将画布(此菜单的根)添加为左手的子画面,则应使用左手移动和旋转.
请注意,画布的渲染模式必须是World Space.
这是父母(左手):
正确设置canvas的rect变换值(最重要的部分是pos.z,我改变了画布的比例而不是改变z.我可以改变画布的宽度和高度,但会产生不利影响)
它会像你在旋转父对象时所描述的那样(左手):
编辑
将此脚本添加到相机
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); menuGUI.SetActive(true); menuGUI.transform.position = hand.transform.position; } else{ menuGUI.SetActive(false); } } }
将gui菜单分配给menuGUI
将左手分配到手
你还可以在menuGUI旋转中包含手的旋转元素:
menuGUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x,hand.transform.eulerAngles.y,hand.transform.eulerAngles.z);
我还没有测试过这个,但是菜单GUI.transform.eulerAngles = new Vector3(transform.eulerAngles.x,0);也应该工作正常.
如下所示,当在相机前方看到画布时,相机和画布的rotation.eulerAngles.x是相同的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。