【问题标题】:Jittery motion when interpolating movement in unity3d在unity3d中插值运动时的抖动运动
【发布时间】:2021-05-25 11:52:18
【问题描述】:

基本上,我的 fps 播放器上有两个枪物。真枪和玩家看到的枪。我有一个关于枪的脚本,玩家看到它通过插值跟随作为相机子级的真枪的位置和旋转。

旋转没问题,但枪的位置让我感到不安。这是我在玩家看到的枪上的平滑移动脚本:

public Transform target; //The gun that the player doesn't see
public float moveSpeed = 0.125f;
public float rotateSpeed = 0.125f;

void LateUpdate()
{
    //this is causing the jittery motion
    transform.position = Vector3.Lerp(transform.position, target.position, moveSpeed);

    //this is very smooth
    transform.rotation = Quaternion.Lerp(transform.rotation, target.rotation, rotateSpeed);
}

有人知道为什么吗?

【问题讨论】:

  • 您能否确认moveSpeedrotateSpeed 的值与Inspector 中配置的值匹配?
  • @derHugo 是的,他们匹配

标签: unity3d interpolation


【解决方案1】:

编辑: 否则,我会为你的 moveSpeed 选择一个更明智的单位,这在你的世界中是有意义的,例如1 米,然后我会使用 Time.deltaTime 来平滑运动。如果太慢或太快,您可以调整速度单位。

[SerializeField] private float moveSpeed = 1f;

void LateUpdate()
{
    var t = moveSpeed * Time.deltaTime; //< just to highlight

    transform.position = Vector3.Lerp(transform.position, target.position, t);
}

使用 Time.deltaTime 的实际原因是根据您的帧速率帮助平滑,如果您获得较低的帧,Lerp 将进行调整。这个常用方法也有说明in this answer by Eric5h5 from Unity forum


嗯,我想知道你是否真的需要一个 Lerp 来更新枪的位置,如果你想同步两者,我只会更新你的 transform.position = target.position,因为它每帧都完成,它们会同步。

添加 lerp 只会延迟同步。

您看到四元数和 Lerp 之间的区别只是您无法比较这两个速度,我相信您设置的旋转速度比 lerp 的速度快得多。

【讨论】:

  • 添加 Lerp 很可能是为了作为稳定器来插入和平滑抖动的用户/控制器输入;)
  • 这是为了平滑运动,这就是拥有两支独立枪的全部原因
  • @JOGUA 好的,改变了我的答案,这就是我接下来要做的。
  • @JOGUA 我希望它有效!在 Stackoverflow 上,您实际上可以对答案进行投票并将其标记为正确答案(仅在这种情况下),这是表示感谢的最佳方式;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多