我正在尝试创建一个脚本,允许我使用Slerp效果旋转相机,范围从0°-360°(y轴)到水平滑块。相机只沿轴旋转(我在房间中间,我必须使用水平滑块转动)
我做了两个脚本: 第一个应用于参考立方体以获得旋转,第二个应用于腔室以获得Slerp效果,同时跟随立方体的旋转。
360°立方体旋转脚本:
public float speed;
public Vector3 offset;
public GameObject ObjectToRotate;
public void SliderChanged(float speed)
{
ObjectToRotate.transform.rotation = Quaternion.Euler (speed*offset);
}
使用Slerp效果进行相机旋转的脚本:
public Transform target;
public float Speed = 0.1F;
// Update is called once per frame
void Update () {
transform.rotation = Quaternion.Slerp (transform.rotation, target.rotation, Speed);
}
}
它有效但有一些问题: 如果我从左侧(0°)到右侧(359°)滑动太快,则Slerp旋转不能正确地继续,但似乎只旋转1°,就好像它已经回来一样。
我该如何解决?谢谢!
答案 0 :(得分:0)
Slerp
将始终采用方向之间的最短路径,因此,如果您从0
开始并希望以359
结束,那么您将无法通过所有这些获得良好的轮换价值观,但你已经得到了你已经看到的东西。
我的想法是如何解决它:
不要使用Transform
将数据从UI滑块传递到对象。仅使用具有角度值的float
。从UI获取并将其作为目标旋转传递给对象。
要旋转的对象将其最后一个旋转值存储为float。当你设置新目标时,它会对每帧的浮点进行插值。我们假设您的轮换为0
,现在您将目标设置为359
,因此我们正从0
向正方向旋转。如果每帧的速度为10 deg
,那么您最终会轮换10
并将其存储为最后一次轮换。
如果旋转已更改,则使用角度值(10)计算新四元数。
这样,您可以在线性空间中完成插值,其中0-359
范围的行为与预期的一致。然后,在插值之后引入四元数以将此值用作旋转数据。