[原创]使用InvokeRepeating+差值器平滑抬高摄像头

2022-07-15  本文已影响0人  吉凶以情迁

判断角度差使用Quaternion.Angle(targetRotation, Camera.main.transform.rotation)
如果直接用 Camera.main.transform.rotation.x判断你会发现, 递减到0之后又到了360,显然是不行的。它永远是0到360的循环

Camera.main.transform.eulerAngles = Vector3.Lerp(Camera.main.transform.eulerAngles,new Vector3(-40, Camera.main.transform.eulerAngles.y, Camera.main.transform.eulerAngles.z), Time.deltaTime);
Camera.main.transform.eulerAngles和四元素的写法都是可以实现平滑过渡的
,不过 LerpSlerp是有点不一样的。一个是球性差值器,一个是线性差值器

    void CameraUp()
    {



        Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.rotation.y, Camera.main.transform.rotation.z);// * Quaternion.identity;
        string str=(Quaternion.Angle(targetRotation, Camera.main.transform.rotation))+"差";
            print("angle x:" + Camera.main.transform.eulerAngles.x+",差多少:"+str);

        Camera.main.transform.rotation = Quaternion.Slerp(Camera.main.transform.rotation, targetRotation, Time.deltaTime * 2);//利用Slerp插值让物体进行旋转  2是旋转速度 越大旋转越快

            //Camera.main.transform.eulerAngles = Vector3.Lerp(Camera.main.transform.eulerAngles,new Vector3(-40, Camera.main.transform.eulerAngles.y, Camera.main.transform.eulerAngles.z), Time.deltaTime);

        if (Quaternion.Angle(targetRotation, Camera.main.transform.rotation) <1)
        {
            CancelInvoke("CameraUp");
            print("cancel");
            return;
        }
        else
        {
        }


        }

image.png

网上的方法是用在Update() 为了方便理解 这东西,以及用在特殊场景,隐藏我使用定时器实现了任意场景执行 摄像头平滑转动效果
另外, 不用四元素而是用欧拉角的方法转动 我也不知道咋判断距离差了,Camera.main.transform.eulerAngles同样可以达到效果,却不知道该如何停下

2022-7-15 11:32:49
经过Miracle大佬的指点,我想要的效果实现了

上面的两种方法都是有bug的,一种是 因为```
Euler


二第二种方法虽然没有左右晃动的bug,但是判断逻辑是有问题的,
欧拉角的修改 则用欧拉角的四元素转换
   if (Quaternion.Angle(targetRotation, Quaternion.Euler(Camera.main.transform.localEulerAngles.x, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z)) < 1)
和之前代码区别就是 这里 传递的是```Quaternion.Euler(```而不是直接的```rotation```
方法1  使用 ```Camera.main.transform.localEulerAngles```
    Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z);// * Quaternion.identity;
    string str = (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation)) + "差";
    print("angle x:" + Camera.main.transform.localEulerAngles.x + ",差多少:" + str);

    Camera.main.transform.localEulerAngles = Vector3.Lerp(Camera.main.transform.localEulerAngles, new Vector3(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z), Time.deltaTime);

    if (Quaternion.Angle(targetRotation, Quaternion.Euler(Camera.main.transform.localEulerAngles.x, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z)) < 1)
    {
        CancelInvoke("CameraUp");
        print("cancel");
        return;
    }
    else
    {
    }



方法2:
Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z);// * Quaternion.identity;
            string str = (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation)) + "差";
            print("angle x:" + Camera.main.transform.localEulerAngles.x + ",差多少:" + str);

            Camera.main.transform.localRotation = Quaternion.Slerp(Camera.main.transform.localRotation, targetRotation, Time.deltaTime * 2);//利用Slerp插值让物体进行旋转  2是旋转速度 越大旋转越快


            if (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation) < 1)
            {
                CancelInvoke("CameraUp");
                print("cancel");
                return;
            }
            else
            {
            }
上一篇 下一篇

猜你喜欢

热点阅读