c#-相机无法平滑地插值其旋转
作者:互联网
我在现场遇到问题.我正在做的是有两个面板,两个面板都有一个按钮,它们使用方法名称RotateCamera()执行OnClick()侦听器.
在层次结构中,还有一个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