与lerp制作精确的角度

时间:2015-05-01 15:16:07

标签: unity3d rotation smooth

如何使用lerp以精确的角度滚动对象 例如,90 = 90,而不是90 = 89.9982

Vector3  Angle = new Vector3(FirstGizmo.transform.eulerAngles.x, 90f,
  FirstGizmo.transform.eulerAngles.z);

FirstGizmo.transform.eulerAngles = Vector3.Lerp(FirstGizmo.transform.eulerAngles,
  Angle,Time.deltaTime );

我已经使用过此代码,但没有得到确切的角度(90 = 89.9982)。有没有办法让这个函数产生精确的角度?

1 个答案:

答案 0 :(得分:-1)

Vector3.Lerp是一种在两个Vector3之间线性插值的方法。

为简单起见,参数 t [0..1]是 from 值和 to 值之间的光标。

  • 如果 t 等于0,则该方法将从返回
  • 如果 t 等于1,则该方法会将返回
  • 如果 t 等于0.5,该方法将返回的确切位置中的位置。

在此,您将返回的值从分配给。所以它会“平滑”地旋转你的对象,但 t Time.deltaTime )可能永远不会等于1,所以来自只会收敛到而不到达它。

所以修复可能是:

float t = 0f;

while (t < 1f) { // for example
    Vector3 initial = FirstGizmo.transform.eulerAngles;
    Vector3 Angle = new Vector3(FirstGizmo.transform.eulerAngles.x, 90f , FirstGizmo.transform.eulerAngles.z);

    FirstGizmo.transform.eulerAngles = Vector3.Lerp(initial, Angle, t);

    t += Time.deltaTime;
    yield return null; // if you are in a coroutine
}

它会线性旋转你的物体。

如果你想顺利地做到这一点:

Vector3 Angle = new Vector3(FirstGizmo.transform.eulerAngles.x, 90f , FirstGizmo.transform.eulerAngles.z);
float speed = 10f;

while (Vector3.Distance(FirstGizmo.transform.eulerAngles, Angle) > 0.1f) { // for example
    FirstGizmo.transform.eulerAngles = Vector3.Lerp(FirstGizmo.transform.eulerAngles, Angle, speed * Time.deltaTime);

    yield return null; // if you are in a coroutine
}
// So it will leave the loop when it's very close (0.1f) to *to* (here Angle)
FirstGizmo.transform.eulerAngles = Angle;