我正在尝试为 HTC VIVE 制作图形用户界面,但在某些 Controller 角度打开它时遇到问题。
我做了一些工作并取得了一些粗略的成果,因为我的对象是一个 child ,这让我很难跟踪它的旋转或位置,因为我希望它只在 Controller 处于特定角度时打开(作为一个人看着他的 watch )
这是一些视觉示例:
当我旋转 Controller 时,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();
}
}
}
}
}
我不知道做这种任务是正确的方法吗? 我想以简单的方式在某些 Controller 旋转时显示 GUI。
这就是我所说的层次结构
最佳答案
有一个简单的解决方案来处理 UI 旋转。
我想您有一个用于 GUI 的 Canvas 。此 Canvas 可以是任何对象的子对象。如果您将 Canvas (此菜单的根)添加为左手的子项,它应该用左手移动和旋转。
注意 Canvas 的渲染模式必须是World Space
。
这是父级(左手):
正确设置 Canvas 的矩形变换值(最重要的部分是pos.z,我改变了 Canvas 的比例而不是改变z。我可以改变 Canvas 的宽度和高度但它会产生不利影响)
当旋转父对象(左手)时,它将像您描述的那样运行:
编辑
将此脚本添加到您的相机
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 是相同的
关于c# - 在某些 HTC VIVE Controller 上打开 GUI Angle/Turn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41520074/