编程语言
首页 > 编程语言> > c#-相机无法平滑地插值其旋转

c#-相机无法平滑地插值其旋转

作者:互联网

我在现场遇到问题.我正在做的是有两个面板,两个面板都有一个按钮,它们使用方法名称RotateCamera()执行OnClick()侦听器.

Image 1

在层次结构中,还有一个MainMenu游戏对象,该对象附带一个脚本.当我播放场景并单击面板上的一个按钮时,MainCamera会相对于第二个面板的方向旋转90度.脚本运行良好,但是我想在单击该按钮时将摄像机平滑地旋转到该面板上-现在,它可以立即旋转.我不知道我在这个脚本上做错了什么.

public class CameraSmooth : MonoBehaviour {

    private bool check = false;
    private Transform from;
    private Transform to;

    void Start(){
        from = Camera.main.transform;
    }

    void Update(){
        if (to != null) {
            Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime);
        }
    }

    public void RotateCamera(){
        if (!check) {
            Camera.main.transform.Rotate (0,90f,0f);
            to = Camera.main.transform;
            check = true;
        }
        else if (check) {
            Camera.main.transform.rotation = Quaternion.identity;
            to = Camera.main.transform;
            check = false;
        }
    }
}

解决方法:

这里的主要问题是您要在RotateCamera()中调用Camera.main.transform.Rotate().这将导致旋转立即应用于相机,从而导致您看到的即时旋转.

另一个小小的误解-由于Transform是参考类型,因此始终始终指向和指向同一实例(相机的Transform)!最后,3 * Time.deltaTime的值将始终平均在3/60左右,并且可能永远不会接近1,这是完成插值所必需的.因此,以下行:

Camera.main.transform.rotation = Quaternion.Slerp (from.rotation, to.rotation, 3 * Time.deltaTime);

即使解决了第一个问题,也将无能为力.

我认为这种情况需要一种不同的解决方案:

>将目标旋转存储在四元数变量中,而不是直接在“变换”上设置目标旋转,并跟踪摄像机的初始旋转
>维护一个可以跟踪旋转进度的计时器(或者您可以放弃Slerp()并直接应用增量旋转,这也是一种有效的方法)

这是我建议的代码更新:

public class CameraSmooth : MonoBehaviour {

    private bool check = false;
    private float rotationProgress = 1;
    private Quaternion initial;
    private Quaternion from;
    private Quaternion to;

    void Start(){
        // Cache the starting rotation, so we can calculate rotations relative to it
        initial = Camera.main.transform.rotation;
    }

    void Update(){
        if (rotationProgress < 1) {
            rotationProgress += 3 * Time.deltaTime;
            Camera.main.transform.rotation = Quaternion.Slerp (from, to, rotationProgress);
        }
    }

    public void RotateCamera(){
        from = Camera.main.transform.rotation;
        rotationProgress = 0;

        if (!check) {
            to = initial * Quaternion.Euler(0,90f,0f);
            check = true;
        }
        else if (check) {
            to = initial;
            check = false;
        }
    }
}

(尚未测试此代码,所以请让我知道是否有任何问题.)希望这会有所帮助!如果您有任何疑问,请告诉我!

标签:unity3d,rotation,c,interpolation
来源: https://codeday.me/bug/20191118/2025614.html