碰撞检测实施中的哪个故障导致彼此碰撞的球旋转

时间:2012-09-21 10:56:39

标签: ruby language-agnostic collision-detection game-engine game-physics

嗨我在红宝石中进行了以下球对球碰撞检测的实施,这对大多数碰撞都有效。当某些天使的球碰到对方时,怎么会有一些瑕疵。

如果您需要更多信息告诉我,我已将我的实施放在这里。但我总体上想知道更多。是什么原因导致球在某些撞击角度下相互旋转。

def ball_collider! ball
        for ball2 in @balls do
          next if ball.object_id == ball2.object_id
          next unless box_overlap ball2.boundbox, ball.boundbox
          next unless ball_overlap ball, ball2
          dx = ball2.x - ball.x
          dy = ball2.y - ball.y
          dist=Math.sqrt(dx**2 + dy**2)
          bonuce_point_x = ball2.x - (ball.radii + ball2.radii) * dx / dist
          bonuce_point_y = ball2.y - (ball.radii + ball2.radii) * dy / dist

          bounce_line =  [[bonuce_point_x,bonuce_point_y],[bonuce_point_x-dy,bonuce_point_y+dx]]

          ball2.bounce! bounce_line
          ball.bounce! bounce_line
          motion_left = ball.unmove! bounce_line, true
       ball_controller! ball if motion_left > 0.1
  end
end

def box_overlap box1, box2
  return (box1[:width] + box2[:width] > (box1[:x] - box2[:x]).abs) && (box1[:width] + box2[:width] > (box1[:y] - box2[:y]).abs)
end

def ball_overlap ball1, ball2
  dx = ball2.x - ball1.x
  dy = ball2.y - ball1.y
  return (dx**2 + dy**2) < (ball1.radii+ball2.radii)**2
end 

1 个答案:

答案 0 :(得分:1)

在物理模型中,您可能会以不连续的时间间隔更新位置并进行碰撞检查。这意味着当您检测到一对球之间发生碰撞时,实际碰撞会在此之前发生,并且您的计算将基于错误的运动矢量。您可以进行计算以获得正确的影响时间,但由于其他对象与您在同一时间间隔内检查的两个对象发生冲突,这可能会变得混乱。尝试增加频率(即减少时间间隔)以限制问题。

至于为什么你会得到“漩涡”效果:在你修改它们的向量之后,计算将导致球仍然相互碰撞,即使它们现在彼此远离,这将再次导致你的下一个迭代将它们再次拉向彼此的中心,依此类推。