滑块

时间:2018-06-06 11:16:22

标签: 3d rotation slider 360-degrees

我正在尝试创建一个脚本,允许我使用Slerp效果旋转相机,范围从0°-360°(y轴)到水平滑块。相机只沿轴旋转(我在房间中间,我必须使用水平滑块转动)

我做了两个脚本: 第一个应用于参考立方体以获得旋转,第二个应用于腔室以获得Slerp效果,同时跟随立方体的旋转。

360°立方体旋转脚本:

    public float speed;
    public Vector3 offset;
    public GameObject ObjectToRotate;

    public void SliderChanged(float speed)
    {
        ObjectToRotate.transform.rotation = Quaternion.Euler (speed*offset);
}

使用Slerp效果进行相机旋转的脚本:

    public Transform target;
    public float Speed = 0.1F;


    // Update is called once per frame
    void Update () {
        transform.rotation = Quaternion.Slerp (transform.rotation, target.rotation, Speed);     
    }
}

它有效但有一些问题: 如果我从左侧(0°)到右侧(359°)滑动太快,则Slerp旋转不能正确地继续,但似乎只旋转1°,就好像它已经回来一样。

我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:0)

Slerp将始终采用方向之间的最短路径,因此,如果您从0开始并希望以359结束,那么您将无法通过所有这些获得良好的轮换价值观,但你已经得到了你已经看到的东西。

我的想法是如何解决它:

  1. 不要使用Transform将数据从UI滑块传递到对象。仅使用具有角度值的float。从UI获取并将其作为目标旋转传递给对象。

  2. 要旋转的对象将其最后一个旋转值存储为float。当你设置新目标时,它会对每帧的浮点进行插值。我们假设您的轮换为0,现在您将目标设置为359,因此我们正从0向正方向旋转。如果每帧的速度为10 deg,那么您最终会轮换10并将其存储为最后一次轮换。

  3. 如果旋转已更改,则使用角度值(10)计算四元数。

  4. 这样,您可以在线性空间中完成插值,其中0-359范围的行为与预期的一致。然后,在插值之后引入四元数以将此值用作旋转数据。

    BTW:通过这个技巧你也可以使用更大的范围,比如0-720,可以进行两次或更多次旋转。你不能使用Quaternions做同样的事情。