0
点赞
收藏
分享

微信扫一扫

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


判断角度差使用​​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​​​和四元素的写法都是可以实现平滑过渡的
,不过 ​​​Lerp​​​和​​Slerp​​是有点不一样的。一个是球性差值器,一个是线性差值器

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
{
}


}




[原创]使用InvokeRepeating+差值器平滑抬高摄像头Camera角度_代码区


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
{
}

举报

相关推荐

0 条评论