根据初始角度和当前角度计算旋转增量

时间:2016-05-28 21:00:30

标签: c# math unity3d rotation

我希望跟踪两个读数之间的旋转增量(y轴)。

有一个游戏对象,我从它开始移动时读取一个初始角度。 然后我有另一个变量在更新循环期间读取实时角度。

我希望delta值不确定它是负还是正,基本上我将应用相同的更新,无论对象向左或向右旋转20度。

编辑: 我希望delta值是最小的角度,所以最大值可以是180,然后再减去0。

实施例: 如果我的initFaceAngle == 5和currentFaceAngle == 355那么myAngle == 10

void Start()
{
    initFaceAngle = hmd.transform.rotation.eulerAngles.y;
}
void update()
{    
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y;
    // My terrible first attempt... look ma' I can math.
    float myAngle = (float)Math.Abs(initFaceAngle - currentFaceAngle);
}

显然我的计算不起作用,因为获得两个角度之间的差异并没有考虑到360度。所以我觉得我需要一些馅饼(pi),但除了作为一个令人印象深刻的馅饼(pi)食客外,我不知道如何调用它神奇的数学能力。

我需要使用什么公式来捕获delta?

无论是向左还是向右旋转,如何使其读取相同?

2 个答案:

答案 0 :(得分:1)

因为你只需要初始位置和当前位置之间的角度,它实际上不涉及数学,只需要进行简单的检查就可以看出哪个值最大。

void update()
{    
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y;
    float myAngle;
    if(initFaceAngle > currentFaceAngle)
        myAngle = initFaceAngle - currentFaceAngle;
    else
        myAngle = currentFaceAngle - initFaceAngle;

    if(myAngle > 180)
        myAngle = 360 - myangle;
}

答案 1 :(得分:1)

我想我已经找到了解决方案,不确定它是否是最优雅的,但输出值看起来是正确的。

void Start()
{
    initFaceAngle = hmd.transform.rotation.eulerAngles.y;
}
void update()
{    
    currentFaceAngle = hmd.transform.rotation.eulerAngles.y;
    float myAngle = getDeltaAngle(initFaceAngle, currentFaceAngle);
}

public static float getDeltaAngle(float a, float b)
{
    float x;
    float y;


    if (a > b)
    {
        x = a;
        y = b;
    }
    else
    {
        x = b;
        y = a;
    }

    if (x - y < 180)
    {
        x = x - y;
    }
    else
    {
        x = (360 - x) + y;
    }

    return x;
}