为什么当使用 lerp 缓慢旋转时,它不会一直旋转,如果旋转,无论给出什么速度值,它都会旋转得非常快?



开始时:

void Start()
{
ControlPanel.KeyPressed += OnKeyPressed;
}

在按下OnKeyPressed:的情况下

private void OnKeyPressed(PressedKeyCode[] obj)
{
float tempY = 0;
float tempX = 0;
// stable forward
if (hMove.y > 0)
tempY = - Time.fixedDeltaTime;
else
if (hMove.y < 0)
tempY = Time.fixedDeltaTime;
// stable lurn
if (hMove.x > 0)
tempX = -Time.fixedDeltaTime;
else
if (hMove.x < 0)
tempX = Time.fixedDeltaTime;

foreach (var pressedKeyCode in obj)
{
switch (pressedKeyCode)
{
case PressedKeyCode.SpeedUpPressed:
EngineForce += 0.1f;
break;
case PressedKeyCode.SpeedDownPressed:
EngineForce -= 0.12f;
if (EngineForce < 0) EngineForce = 0;
break;
case PressedKeyCode.ForwardPressed:
if (IsOnGround) break;
tempY = Time.fixedDeltaTime;
break;
case PressedKeyCode.BackPressed:
if (IsOnGround) break;
tempY = -Time.fixedDeltaTime;
break;
case PressedKeyCode.LeftPressed:
if (IsOnGround) break;
tempX = -Time.fixedDeltaTime;
break;
case PressedKeyCode.RightPressed:
if (IsOnGround) break;
tempX = Time.fixedDeltaTime;
break;
case PressedKeyCode.TurnRightPressed:
{
if (IsOnGround) break;
var force = (turnForcePercent - Mathf.Abs(hMove.y)) * HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
case PressedKeyCode.TurnLeftPressed:
{
if (IsOnGround) break;
var force = -(turnForcePercent - Mathf.Abs(hMove.y)) * HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
case PressedKeyCode.BackToBase:
{
Vector3 direction = helicopterPlatform.transform.position - transform.position;
Quaternion toRotation = Quaternion.FromToRotation(transform.forward, direction);
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * Time.time);
//transform.LookAt(helicopterPlatform.transform);
}
break;
}
}
hMove.x += tempX;
hMove.x = Mathf.Clamp(hMove.x, -1, 1);
hMove.y += tempY;
hMove.y = Mathf.Clamp(hMove.y, -1, 1);
}

我添加了最后一部分:

case PressedKeyCode.BackToBase:
{
Vector3 direction = helicopterPlatform.transform.position - transform.position;
Quaternion toRotation = Quaternion.FromToRotation(transform.forward, direction);
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * Time.time);
//transform.LookAt(helicopterPlatform.transform);
}
break;

当我使用LookAt时,它工作得很好,但旋转有点太快了,这就是我如何使用LookAt:

transform.LookAt(helicopterPlatform.transform);

然后我决定使用方向,旋转和四元数。Lerp,但现在当我按下键代码B时,这是后退的键代码,它使物体(直升机(旋转,然后按它所面对的方向旋转回来,我需要在B上按多次,使它面向直升机平台旋转。

这是一个完整脚本的链接,有点长,所以我不确定是否应该把它放在我的问题中,所以我把它上传到了pastebin.com:https://pastebin.com/YDfbVkH6

Lerp的t值不是速度值,而是点a和点B 之间的进度

来自Lerp上的文档:

t:用于在a和b之间插值的值。

这意味着如果你得到以下代码

Quaternion.Lerp(transform.rotation, toRotation, t);

t = 0时,lerp将返回存储在transform.rotation中的任何内容,而当t = 1时,它将返回toRotation中的任何信息,t = 0.5f将返回这些值之间的任何信息。对于0和1之间的任何值,依此类推。

文件中的时间如下所示:

此帧开始的时间(只读(。这是自游戏开始以来的时间(以秒为单位(。

所以你现在主要做的是:

transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * time since the start of the game);

正如您所看到的,在场景运行几秒钟后(取决于您的lookAtSpeed(,该值将迅速超过1,这意味着它将始终返回toRotation

您想要的是使用协程将t值从0缓慢地递增到1,看起来像这样,它将根据您的lookAtSpeed 从0缓慢递增到1

internal IEnumerator LerpToPosition()
{
lookAtSpeed = 2f;
float t = 0f;
while (t < 1f)
{
t += lookAtSpeed  * Time.deltaTime;
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, t);
yield return waitFrame;
}
}

最新更新