【问题标题】:Physics Engine Spring Bug物理引擎 Spring Bug
【发布时间】:2012-03-24 06:29:58
【问题描述】:

所以我一直在研究支持多边形和圆形的 2d 物理引擎。我已经将分离轴定理用于除圆-圆之外的所有碰撞组合。这是引擎的基本格式:

*注意:不是实际代码

推进所有身体。

for every body a
{
   Vector2 sum = Vector2.Zero;
   for every body b where b != a
   {
     sum += a.collides(b).MinimumTranslationVector;
   }
   a.Position += sum;
   a.velocity += sum;
}

这是我遇到的问题的视频:http://www.youtube.com/watch?v=kSZeuP4AiQ0&feature=youtu.be

错误是在开头附近看到的弹簧效应。我一直在绞尽脑汁想这个问题,但我一无所获。谁能告诉我是什么问题?

【问题讨论】:

  • 你指的是堆栈内的弹性吗?
  • 是的,我指的是堆栈内的弹性。
  • 这可能是由很多事情引起的。物体的大小、质量、重力、你的碰撞处理......这是相当正常的事情。我不确定你如何处理你的碰撞,但是如果新的顶部“盒子”与堆栈的顶部发生碰撞,你只是处理这个新的碰撞,还是你也迭代地考虑堆栈中的新碰撞?
  • 我只是迭代地解释堆栈中的新碰撞。目前,我认为问题在于盒子与堆栈顶部发生碰撞,但堆栈顶部向下移动而不是盒子向上移动。我的引擎目前也处于初始阶段。我没有考虑质量、动量、旋转等。
  • 如果你想要真实感,你的“力量”需要影响“速度”而不是“位置”。

标签: physics-engine


【解决方案1】:

如果我正确阅读了这个伪代码,每当两个物体发生碰撞时,每个物体的位置和速度都会发生变化。然而,当一个落下的盒子撞到一个静止的盒子时,你希望静止的盒子保持静止。

  1. 我认为你应该重新考虑你的基本碰撞物理。真正的碰撞不会那样工作。
  2. 考虑缩小时间步长。毕竟,真实的物体有弹性的,但“刚性”物体的振动太快,我们无法看到;橡胶状的积木堆看起来像一堆慢动作的刚性物体,所以如果你加快它们的速度,它们看起来会更僵硬。大范围的运动已经是正确的。
  3. 如果您希望对象不可穿透,则必须为此实施特殊规则。我不知道墙壁是否坚不可摧,但这将是一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多