判断角度差使用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
{
}
}
![](https://img.haomeiwen.com/i2815884/c2d52985979a0a1b.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
{
}
网友评论