1

こんにちは私はルビーでボールからボールへの衝突検出の次の実装を持っています。これはほとんどの衝突でうまく機能します。ボールが特定の天使にぶつかると、いくつかの欠陥があります。

さらに情報が必要な場合は、ここに実装を記載しました。しかし、私は一般的にもっと疑問に思っています。特定の角度の衝撃でボールが互いに渦を巻く原因.

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 
4

1 に答える 1

1

物理モデルでは、おそらく位置を更新し、離散時間間隔で衝突チェックを行っています。これは、ボールのペア間の衝突を検出した場合、実際の衝突はその時間よりも少し前に発生していたため、間違った移動ベクトルに基づいて計算が行われることを意味します。衝突の正確な時間を取得するために計算を行うことはできますが、同じ時間間隔内でチェックしている 2 つのオブジェクトとの衝突に他のオブジェクトが関与しているため、これは面倒になる可能性があります。問題を制限するために、頻度を増やしてください (つまり、時間間隔を減らしてください)。

「渦巻き」効果が得られる理由については、計算により、ベクトルを変更した後でもボールが互いに衝突し、ボールが互いに離れている場合でも、次の反復が引っ張られます。それらを再び互いの中心に向けて、というように繰り返します。

于 2012-09-21T12:26:33.867 に答える