我是Virtual Reality的新手。我正在使用Oculus Rift for Headset和Leap Motion进行交互。当用户用手旋转对象时,我希望触发特定事件。
这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class step1 : MonoBehaviour
{
public GameObject object;
public ParticleSystem event;
void Start()
{
}
// Update is called once per frame
void Update()
{
if(object.transform.rotation == Quaternion.AngleAxis(-30,Vector3.right))
{
Debug.Log("Done");
event.Play();
}
}
}
请注意,因为四元数可以表示最多两个完整旋转(720度)的旋转,所以即使结果旋转看起来相同,此比较也可以返回false。
来自Quaternion.operator == Unity Docs
我会避免全部使用四元数,因为它们很难缠绕你的头并且使用起来很笨拙。
尝试使用Vector3
表示与eulerAngles
,然后测试近似等于这样的值:
//only checks for one axis!
if(Math.Abs(rotationA.eulerAngles.x - rotationB.eulerAngles.x) <= maxDifference)
{
//do stuff
}
或坚持使用Quaternion.Angle
但使用它像这样:
//compares angle directly
if(Math.Abs(Quaternion.Angle(rotationA, rotationB)) <= maxDifference)
{
//do stuff
}
内部有三个Vector3
值的float
consists和Quaternion.Angle
返回float
值。在99%的情况下,比较它们的确切平等并不起作用。将它们与您可以接受的最大差异进行比较,它应该可以工作。
你想要开火吗?
顺便说一句,你不必只选择其中一个
目前你的实现只会在你的对象具有特定的旋转时触发事件是什么预期的行为?