用户控制的Quaternion Slerp?

时间:2016-04-19 16:56:16

标签: unity3d user-controls rotation quaternions gameobject

我正在尝试使用用户控件旋转球体。

void RotateGlobe() {
    SetLock();

    if (Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        userInput.x = Input.GetAxis("Mouse X");
        userInput.y = Input.GetAxis("Mouse Y");

        if (userInput.magnitude > 0 & Physics.Raycast(ray, Mathf.Infinity, LayerMask.NameToLayer("UI")))
        {
            Vector2 movement = new Vector2(Mathf.Sign(userInput.x), Mathf.Sign(userInput.y));

            globe.transform.rotation = 
                Quaternion.Slerp(globe.transform.rotation, 
                Quaternion.Euler(0, movement.y * 90, movement.x * 180 + globe.transform.rotation.eulerAngles.x), 
                Time.time * speed);
        }
    }

    RemoveLock();
}

我不太了解Quaternions(然后再次,谁真的这么做),但不仅是地球没有正确响应用户输入,它还会卡在x轴上。我知道它可能是通过不移动从180到-180的最短路径。

我想在这一点上,我完全愿意改变这个代码,转而采用更好的方法(而不是slerp),但我完全陷入困境,以前的方法同样困难且不稳定。

你怎么建议我去旋转这个球体?

作为奖励,如果我可以约束一个我们很棒的轴。我真的不想超过90或-90。

1 个答案:

答案 0 :(得分:2)

简单的解决方案 - 您可以使用Unity的RotateAround,这是他们最有用的电话之一

http://docs.unity3d.com/ScriptReference/Transform.RotateAround.html

请注意,网上有一些令人困惑的评论,不推荐使用RotateAround;实际上它只是一个被弃用的旧版本。这是您在Unity中使用的最常见的呼叫之一。享受!

其次

请注意,您确实在计算欧拉角度!或者可能是localEulerAngles。 你可以简单地在他们之间徘徊!!!!

像......那样......

Vector3 fromEulers = blah;
Vector3 toEulers = blah;

transform.localEulerAngles = .. slerp .. fromEulers toEulers;

最后。请注意,“lerp-like”函数具有类似MoveTowards的等价物,您可以“在自己的步骤中”使用。

SmoothStep实际上是关于所有团结中最有用的召唤!