用户控制的四元数 Slerp?

User controlled Quaternion Slerp?

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

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();
}

我不太了解四元数(话又说回来,谁真正了解),但地球仪不仅没有正确响应用户输入,而且还卡在 x 轴上。我知道它可能通过不动从 180 到 -180 走最短路径。

我想在这一点上,我完全愿意更改此代码以支持更好的方法(不是 slerp),但我完全被卡住了,以前的方法同样困难和不稳定。

你建议我如何旋转这个球体?

作为奖励,如果我可以约束一个轴,那就太好了。我真的不想旋转超过 90 或 -90。

简单的解决方案 - 您可以使用 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 的等价物,您可以使用 "in your own step".

SmoothStep 实际上是 unity 中最有用的调用!