3d 360°;带滑块的slerp水平旋转摄像机

3d 360°;带滑块的slerp水平旋转摄像机,3d,rotation,slider,360-degrees,3d,Rotation,Slider,360 Degrees,我正在尝试创建一个脚本,允许我通过水平滑块在0°-360°(y轴)范围内旋转相机,并具有Slerp效果。相机只能沿着一个轴旋转(我在一个房间的中间,我必须用一个水平滑块旋转) 我制作了两个脚本: 第一个应用于参考立方体以获得旋转,第二个应用于腔室以获得Slerp效应,同时跟随立方体旋转 360°立方体旋转脚本: public float speed; public Vector3 offset; public GameObject ObjectToRotate;

我正在尝试创建一个脚本,允许我通过水平滑块在0°-360°(y轴)范围内旋转相机,并具有Slerp效果。相机只能沿着一个轴旋转(我在一个房间的中间,我必须用一个水平滑块旋转)

我制作了两个脚本: 第一个应用于参考立方体以获得旋转,第二个应用于腔室以获得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°,就好像它回来了一样


我怎样才能解决这个问题?谢谢

Slerp
将始终在两个方向之间采用最短路径,因此如果您从
0
开始,并希望在
359
结束,那么您将无法通过所有这些值进行很好的旋转,但您已经看到了

以下是我的解决方法:

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

  • 要旋转的对象将其上次旋转值存储为float。当您将其设置为新目标时,它会按帧对此浮点值进行插值。假设您的旋转是
    0
    ,现在您将目标设置为
    359
    ,因此我们从
    0
    正向旋转。如果每帧速度为
    10度
    ,则以旋转
    10
    结束,并将其存储为最后一次旋转

  • 如果旋转已更改,则使用角度值(10)计算新的四元数

  • 通过这种方式,您可以在线性空间中完成插值,其中
    0-359
    范围的行为符合您的预期。然后,在插值之后,引入四元数以将该值用作旋转数据


    顺便说一句:有了这个技巧,你也可以使用更大的范围,比如0-720,以能够做两个或更多的旋转。你不能用四元数做同样的事情。

    谢谢你的回复。尽管我在代码方面遇到了障碍,我还是会做一些测试。我试着写脚本,但我无法解决它。旋转仅按脚本(10)中指定的值移动。有人能帮我吗?公共游戏对象对象旋转;浮动值角度=10f;四元数旋转=四元数角度轴(10f,矢量3向上);public void SliderChanged(浮动速度){ObjectToRotate.transform.rotation=rot;}