我正在尝试在Unity3d中进行飞行模拟。首先我使用了rigidbody.addforce()
,但是机芯在旋转方面反应不佳所以我期待Unity3d样本,并尝试使用他们的代码来控制飞机。它工作得很好但我无法理解它是如何工作的。代码是这样的:
var newVelocity = Vector3.Lerp(rig.velocity,
-transform.forward * EnginePower,
EnginePower * Time.deltaTime);
Debug.Log("Velocity: " + rig.velocity +
"Forward: " + -transform.forward * EnginePower +
"Vector3.Lerp: " + Vector3.Lerp(rig.velocity, -transform.forward * EnginePower, EnginePower * Time.deltaTime));
rig.velocity = newVelocity;
此代码位于Update()
函数中,我对其进行了测试,并尝试将其设置为Start()
,飞机正在移动,但没有响应旋转。我试图调试,看看有什么变化,事情是没有什么变化那么多。
我无法理解它是如何运作的。
答案 0 :(得分:0)
你应该在你的Update()
函数中调用它,因为它应该在每一帧运行。 Vector3.Lerp()
在两个3D矢量(documentation)之间执行线性插值。
该函数的第一个参数,我们称之为矢量A,rig.velocity
,是你飞机的当前速度。 -transform.forward * EnginePower
,向量B,是您的向后方向,与您的发动机功率相比 - 可能与用户输入(燃气表)相关。
我不确定为什么transform.forward
与-
相反,但lerp的作用是返回一个新的向量,从向量A到向量B,用因子缩放。如果因子为0,则返回向量A.如果因子为1,则返回Vector B.
在您的代码中,比例为EnginePower * Time.deltaTime
,其中Time.deltaTime
是自上一帧以来的秒数 - 如果您运行60 FPS,则为0.016秒。所以,你可以理解,比例变得非常小,因此Lerp
返回一个非常接近你当前速度的矢量,但是对于矢量B来说却是如此轻微。下一帧,它可以扩展一点,更多一点我希望这可以提高你的理解力。
您可以使用Debug.DrawLine()
绘制矢量,使用它:
Debug.DrawLine(transform.position, rig.velocity, Color.red);
Debug.DrawLine(transform.position, -transform.forward * EnginePower, Color.green);
这将绘制两条线,表示您传递给Lerp
的矢量。这些线是小玩意,所以一定要在编辑器窗口中打开小控件以显示它们(右上角,统计按钮旁边)。