如何在Unity中扭转它时获取对象的旋转?

时间:2018-02-18 23:44:11

标签: c# unity3d oculus

我目前正在Unity for Oculus中实现收音机。玩家可以扭动旋钮来改变音量。但是,在360度旋转时,任何eulerangle或旋转都不能返回唯一值。

以下代码与eulerangle存在同样的问题。

void Start ()
{
    oldRight = Vector3.right;
    angle = 0.0f;
}

void Update ()
{
    Vector3 right = transform.right;
    float tempAngle = Vector3.SignedAngle(oldRight,right,transform.forward);
    if (right.y < oldRight.y)
    {
        angle += tempAngle;
    }
    else
    {
        angle -= tempAngle;
    }
    oldRight = right;
}

2 个答案:

答案 0 :(得分:1)

transform.rotation

如果你想要XYZ角度(而不是四元数),

transform.rotation.eulerAngles

答案 1 :(得分:1)

首先,我们不知道无线电游戏对象和旋钮游戏对象之间的关系是什么,这很重要。

我将举例说明如何在不管这种关系的情况下如何旋转旋钮。

在下图中,收音机是立方体,其变换全部重置为0。

enter image description here

这是用作旋钮的圆柱体:

enter image description here

这里的重要部分是我旋转并放置圆柱体,使变换的X轴平行到立方体的X轴。

这是旋转圆柱体并报告旋转角度的脚本:

using UnityEngine;

public class RotateKnob : MonoBehaviour {
    public float m_Speed;

    void Update() {
        if (Input.GetKey(KeyCode.RightArrow)) {
            transform.Rotate(Vector3.up, Time.deltaTime * m_Speed, Space.Self);
        }

        if (Input.GetKey(KeyCode.LeftArrow)) {
            transform.Rotate(Vector3.down, Time.deltaTime * m_Speed, Space.Self);
        }

        var angle = Vector3.SignedAngle(transform.right, transform.parent.right, transform.up);
        Debug.Log(angle);
    }
}

注意旋转是如何相对于Y轴和Space.Self完成的。

相对于圆柱体的Y轴(我们旋转圆柱体的轴)取angle,因此transform.upSignedAngle第三参数,并且我们测量transform.righttransform.parent.right(圆柱体的多维数据集的transform.right)之间的角度。

使用此代码,您不必担心世界中立方体的变换,结果将始终相对于旋转圆柱体时的立方体。

请务必记住,angle将在[-180,180]范围内报告,而不是[0,360]