【问题标题】:3D Model movement, finding a better way to move a 3d model3D 模型移动,寻找移动 3D 模型的更好方法
【发布时间】:2014-06-05 20:41:00
【问题描述】:

假设我正在尝试移动 3d 模型并保持简单,我将在 x 轴上移动它。我从位置 0.0 开始并将其移动到位置 10.0。

问题在于,根据我移动的速度,我最终会出现位置错误,这意味着我需要快速回到位置 10.0。

例如,如果速度为 3.0,那么我将每帧的 x 位置加 3.0 0.0 3.0 6.0 9.0 12.0

如果我想在达到 10.0 时停止,我可以使用此代码

 if(model.x <= 10.0f)
    model.x += speed * FrameTime;
else 
    model.x = 10.0f;

但是模型会在它意识到它已经超过 10.0 之前到达位置 12.0

这也意味着我移动得越快,错误就会越大。

任何人都可以提出一个更好的方法来移动模型,以便消除或至少减少错误,这样我的模型看起来就不会反弹。

【问题讨论】:

  • 为什么不在应用更新后将其限制为 10.0? (例如if (model.x &gt; 10.0f) model.x = 10.0f; 当然,当它突然卡到 10.0f 时会产生不自然的抖动。如果这是不可接受的,您可以添加某种阻尼器。
  • 上面的代码正是这样做的,这就是我试图摆脱的急躁。你能扩大“阻尼器”吗
  • @Rob85:不,它没有。上面的代码检查尝试在 在进行实际更新之前对其进行钳制 - 这意味着如果更新将其增加到超过 10.0,它将不知道直到下一帧。
  • @Rob85:不,上面的代码并没有完全做到这一点。唯一一次捕捉到 10.0 是第二次发生此更新。夹紧到 10.0f 将是一个单独的 if (...) 在您显示的两个分支之后应用。事实上,您甚至不需要任何这些分支。只需使用:model.x += speed * FrameTime; if (model.x &gt; 10.0f) model.x = 10.0f;
  • 啊,是的,我明白了,所以在我绘制下一帧之前,我将它捕捉到 10.0,这应该几乎可以解决问题。我明白。我会试试看,谢谢你们俩

标签: java android c++ opengl-es opengl-es-2.0


【解决方案1】:
float minX = 0;
float maxX = 10;
float dx = speed * FrameTime;

model.x = Math.max(minX, Math.min(model.x + dx, maxX));

也许不是最清晰的解决方案,但它可以在一行中完成您所需要的。

【讨论】:

  • 感谢您的回答,如果我想从 0 到 10 移动,那效果很好。如何重新排列这种方法,以便我可以从 10 移动到 0。因为
  • dx 值表示帧的变化。因此,朝负方向发展,您可以否定 dx,或使速度为负(这会做同样的事情,但可能以更清洁的方式)。至于夹紧,不需要改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多