2012-02-17 167 views
0

我在屏幕上彈起一個球,並且有一個靜止的矩形,它可以碰撞並且應該反彈。我已經想出瞭如何測試球是否與長方形相撞並且效果很好。現在我需要確定球擊中矩形的哪一側。我目前正在此代碼(適用於測試四條邊,似乎也與角落的問題)......圓形和矩形碰撞Android

if(Math.abs(ball.centerY-boundingBox.top) < ball.radius) { 
    // Hit the top 

} 
else if(Math.abs(ball.centerY-boundingBox.bottom) < ball.radius) { 
    // Hit the bottom 

} 
else if(Math.abs(ball.centerX-boundingBox.left) < ball.radius) { 
    // Hit the left 

} 
else if(Math.abs(ball.centerX-boundingBox.right) < ball.radius) { 
    // Hit the right 

} 

...沒有人有任何想法我怎麼能提高呢?或者想出一個更好的解決方案?

我只是基本上需要確定一個圓碰撞後在一個矩形上擊中哪一邊。我已經想出瞭如何測試它們是否相互碰撞。

謝謝!

回答

1

它可能不適用於角落,因爲當球擊中一個角落時,它同時擊中兩側。如果你想讓它準確反彈,那麼相關的法向矢量就是從球的中心到角落的角度,這個角度在水平和垂直之間是一些對角線。

假設你隨時檢測重疊,同時球的中心是矩形之​​外,你可能想要做的是一樣的東西:

// is the ball above the box? 
if(Math.abs(ball.ballCenterY-boundingBox.top) < ball.radius) 
{ 
    if(ball.ballCentreX >= boundingBox.left) 
    { 
     if(ball.ballCentreY <= boundingBox.right) 
     { 
      // ball hit the top edge 
     } 
     else 
     { 
      // ball hit the top right corner 
     } 
    } 
    else 
    { 
     // hit top left corner 
    } 
} 

一個更好的檢驗 - 處理內外衝突 - 會找到距離每邊最近點的距離,挑選最小距離,然後如果最近點是一個角落,那麼它是一個角落的碰撞,否則它是一個側面碰撞。

+0

你最近發表的關於尋找最近點的評論是我目前正在做我的初始碰撞檢測。我喜歡你的想法,如果最近的點是角落。假設它是一個角落,你有什麼想法我會去確定哪一方基於這個?假設它不直接走向那個角落。順便謝謝你的回答! – DRiFTy 2012-02-17 19:25:03

+0

因爲角落屬於雙方,所以沒有內在的一面。但是,如果您需要選擇一個 - 假設您點擊右上角 - 如果從角點到球體中心的矢量更接近垂直,則可能選擇頂部邊緣,如果接近水平(右邊緣這是對x和y座標的絕對值的比較),並且如果它恰好是45度,則沒有偏好。 – Tommy 2012-02-17 20:00:06

+0

好的,我現在已經做到了,所以它在碰到一個角落時會選擇一邊。只是一個小問題,你可能有一些洞察力......當球在矩形頂部滾動非常緩慢並且即將脫落時,當它到達角落時開始變得有點跳躍。它仍遵循相同的一般路徑,但看起來不太合適。雖然角落似乎現在處理得很好,所以謝謝你。 – DRiFTy 2012-02-17 20:09:42