我尝试通过一个轴将多维数据集旋转90度,如果任何轴位于0位置,则一切正常。但是,如果任何轴在任何位置(例如90或-90),他都会开始无休止地旋转。
视频外观:https://youtu.be/PE4YH19ndCc
public Vector3 targetEulerAngles;
public float spd = 0.1f;
GameObject mainCube;
public void Awake()
{
mainCube = GameObject.FindGameObjectWithTag("mainCube");
}
public void FixedUpdate()
{
mainCube.transform.eulerAngles = Vector3.Lerp(mainCube.transform.eulerAngles, targetEulerAngles, spd);
}
public void RotateToLeft()
{
targetEulerAngles = new Vector3(targetEulerAngles.x + 90f, targetEulerAngles.y, targetEulerAngles.z);
}
public void RotateToRight()
{
targetEulerAngles = new Vector3(targetEulerAngles.x - 90f, targetEulerAngles.y, targetEulerAngles.z);
}
public void RotateToUp()
{
targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z - 90f);
}
public void RotateToDown()
{
targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z + 90f);
}
@ joel64在他的回答中说的确实是正确的,但这不是这里的问题。
问题是您不正确地使用了Lerp。Lerp(a,b,c)的最后一个参数不是SPEED,它是从0到1的进度,其中c <= 0表示结果= a,c> = 1表示结果= b,所有其他值都在两者之间。您的代码不断旋转立方体,并且永不停止,只是随着时间的推移它旋转的越来越少。
使用欧拉角时,由于存在转换错误,因此非常明显;使用四元数时,它的可见性较小,但仍然-旋转不会停止。
为了正确地完成这些工作,您需要编写更多代码。您需要一些变量来保存当前的旋转进度,并且必须记住旋转的开始位置。然后在给定进度的情况下将立方体从起始位置旋转到目标位置,并每帧增加进度。
哦,如果您希望在任何FPS上的旋转都相同,请不要忘记deltaTime。
最终代码为:
public Vector3 targetEulerAngles;
public float spd = 0.1f;
GameObject mainCube;
private Quaternion startRotation;
private float progress = 0;
public void Awake() {
mainCube = GameObject.FindGameObjectWithTag("mainCube");
}
public void FixedUpdate() {
if (progress == 0) startRotation = mainCube.transform.rotation;
mainCube.transform.rotation = Quaternion.Lerp(startRotation, Quaternion.Euler(targetEulerAngles), progress);
progress += spd*Time.fixedDeltaTime;
}
public void RotateToLeft() {
targetEulerAngles = new Vector3(targetEulerAngles.x + 90f, targetEulerAngles.y, targetEulerAngles.z);
progress = 0;
}
public void RotateToRight() {
targetEulerAngles = new Vector3(targetEulerAngles.x - 90f, targetEulerAngles.y, targetEulerAngles.z);
progress = 0;
}
public void RotateToUp() {
targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z - 90f);
progress = 0;
}
public void RotateToDown() {
targetEulerAngles = new Vector3(targetEulerAngles.x, targetEulerAngles.y, targetEulerAngles.z + 90f);
progress = 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句