Unity Quaternion重置基本方向

时间:2016-06-20 22:12:36

标签: math unity3d rotation quaternions euler-angles

我对游戏对象的旋转有问题。 我能够在另一个游戏对象的方向/角度上旋转对象。 但是在第一次旋转之后,游戏对象基于源游戏对象的三角旋转而旋转它开始以不同的方向旋转,因为它已经旋转了一次我猜。

那么有没有办法让第一次旋转后我可以重置旋转,使其再次以另一个物体旋转的角度/方向移动?

这是我目前的代码,我不是数学专家所以我可能做错了.. 所以我想要的基本功能是第二个游戏对象在基本游戏对象旋转的同一方向旋转,但我不希望旋转值相等,旋转值不必相同,它只需要以与基础游戏对象旋转相同的角度/方向旋转。 TiltAgainstObject是源游戏对象。 该脚本附加到第二个游戏对象。

欢迎任何帮助:)。

public class Tilt : MonoBehaviour {

public GameObject TiltAgainstObject;
private float rotX;
private float rotY;
private float rotZ;
private float rotW;
private float deltaX;
private float deltaY;
private float deltaZ;
private float deltaW;

// Use this for initialization
void Start () {

    rotX = TiltAgainstObject.transform.rotation.x;
    rotY = TiltAgainstObject.transform.rotation.y;
    rotZ = TiltAgainstObject.transform.rotation.z;
    rotW = TiltAgainstObject.transform.rotation.w;
}

// Update is called once per frame
void Update () {

    if(OVRInput.Get(OVRInput.Button.One))
    {
        deltaX = TiltAgainstObject.transform.rotation.x - rotX;
        deltaY = TiltAgainstObject.transform.rotation.y - rotY;
        deltaZ = TiltAgainstObject.transform.rotation.z - rotZ;
        deltaW = TiltAgainstObject.transform.rotation.w - rotW;
        gameObject.transform.localRotation = new Quaternion(gameObject.transform.rotation.x + deltaX,
                                                       gameObject.transform.rotation.y + deltaY,
                                                       gameObject.transform.rotation.z + deltaZ,
                                                       gameObject.transform.rotation.w + deltaW);
    }
    rotX = TiltAgainstObject.transform.rotation.x;
    rotY = TiltAgainstObject.transform.rotation.y;
    rotZ = TiltAgainstObject.transform.rotation.z;
    rotW = TiltAgainstObject.transform.rotation.w;
}

}

2 个答案:

答案 0 :(得分:0)

这个问题看起来有点令人困惑,如果你想让第二个游戏对象(你的脚本在哪里)以第一个对象的相同方向旋转你应该这样做:

public class Tilt : MonoBehaviour {

public GameObject TiltAgainstObject;
private float rotX;
private float rotY;
private float rotZ;
private float rotW;
private float deltaX;
private float deltaY;
private float deltaZ;
private float deltaW;

// Use this for initialization
void Start () {

    rotX = TiltAgainstObject.transform.rotation.x;
    rotY = TiltAgainstObject.transform.rotation.y;
    rotZ = TiltAgainstObject.transform.rotation.z;
    rotW = TiltAgainstObject.transform.rotation.w;

    deltaX = 0;
    deltaY = 0;
    deltaZ = 0;
    deltaW = 0;

}

// Update is called once per frame
void Update () {
    rotX = TiltAgainstObject.transform.rotation.x;
    rotY = TiltAgainstObject.transform.rotation.y;
    rotZ = TiltAgainstObject.transform.rotation.z;
    rotW = TiltAgainstObject.transform.rotation.w;

    this.gameObject.transform.localRotation = new Quaternion(rotX + deltaX,
                                                       rotY + deltaY,
                                                       rotZ + deltaZ,
                                                       rotW + deltaW);


}

这样第二个对象将在第一个对象的相同方向旋转,如果你想改变旋转速度,只需修改增量。

如果您希望仅在按下按钮时才进行旋转。只需将其转移到if语句中:

if(OVRInput.Get(OVRInput.Button.One))
    {
      this.gameObject.transform.localRotation = new Quaternion(rotX + deltaX,
                                                       rotY + deltaY,
                                                       rotZ + deltaZ,
                                                       rotW + deltaW);
    }

答案 1 :(得分:0)

我认为问题在于您将世界坐标rotation分配给您的本地坐标localRotation,这可能是一个错字?除此之外,我不确定你为什么直接编辑Quaternion的组件,通常最好将它们组合在一起并使用Unity的功能,因为它处理4个维度经常容易出错。您可以尝试这样的事情:

public class Tilt : MonoBehaviour {

  public GameObject TiltAgainstObject;
  private Quaternion prevRotation;
  private Quaternion currentRotation;

  void Start()
  {
    prevRotation = TiltAgainstObject.transform.rotation;
  }

  void Update()
  {
    currentRotation = TiltAgainstObject.transform.rotation;
    if (OVRInput.Get(OVRInput.Button.One))
      gameObject.transform.rotation *= Quaternion.RotateTowards(prevRotation, currentRotation, 1000f);
    prevRotation = currentRotation;
  }