解決方案1
,對我和任意形狀的行之有效的算法是
- 動圈
- 測試,如果它重疊
- 如果重疊:將其移回
- 讓它改變方向。
這樣你不應該卡住,如果其他部分沒有同時移動。因爲通過後退,你不會重疊,並做mot觸發反彈和改變方向兩次。
溶液2
使用矢量和僅圈:
circle1x, circle1y, circle1radius, circle2x, circle2y, circle2radius
if (circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2 < (circle1radius + circle2radius) ** 2:
# they overlap using http://en.wikipedia.org/wiki/Pythagorean_theorem
# compute new direction
變化方向
計算新的方向可以忽略兩個圓的速度,但不看很自然。
old_direction1 = (v1x, v1y)
velocity1 = (v1x ** 2 + v1y ** 2) ** 0.5
old_direction2 = (v2x, v2y)
distance = ((circle1x - circle2x) ** 2 + (circle1y - circle2y) ** 2) ** 0.5
new_direction1 = ((circle1x - circle2x)/distance * velocity1,
(circle1y - circle2y)/distance * velocity1)
new_direction2 = ((circle2x - circle1x), ...)
但是,您可以使用這個新的方向和舊的方向來創建一個看起來更自然的新方向。我沒有測試了這一點,但它應該是這個樣子:
combined_direction = old_direction + 2 *(old_direction dot-product new_direction)* new_direction
點積爲您提供了投射到一些矢量有方向讀。
而且,一旦你得到這個你可以考慮創建圈子如何重,彈性碰撞:http://en.wikipedia.org/wiki/Collision
你問一個很好的問題。答案在某種程度上取決於您希望遊戲玩法的工作方式。您可以選擇一個非常簡單的模擬或完全真實的模擬。我建議從最簡單的方程開始,以便讓它運行,然後再決定是否需要更精確的模擬來使遊戲變得有趣。你也可以嘗試一下這樣的書:爲遊戲程序員開始數學和物理(http://www.amazon.com/Beginning-Math-Physics-Game-Programmers/dp/0735713901/ref=sr_1_1?s=書籍&ie = UTF8&qid = 1391634202&sr = 1-1&keywords = 0735713901) – Kevin
是的,我認爲從最簡單可行的解決方案開始將是最好的,因爲我試圖教自己如何製作遊戲,並通過擴展一些物理和數學。感謝您的鏈接,只需要找到一個免費版本,我就定了。 – user3276942