2010-05-01 95 views
2

假設我有一個圓形在矩形區域內彈跳。在某一點上,這個圓與矩形的其中一個表面碰撞並反射回來。我會這樣做的通常方法是讓圓形重疊該邊界,然後反映速度矢量。圓圈實際上與邊界重疊的事實通常不是問題,在低速下也不是真正明顯的。在高速度下,這個圈子變得非常清楚,它正在做一些它不應該做的事情。計算移動圓的碰撞而不重疊邊界

我想要做的是以編程方式將反射考慮進去,並在顯示在屏幕上之前將圓放置在適當的位置。這意味着我必須計算它到達它當前位置和未來位置之間邊界的點 - 而不是計算它的新位置,然後檢查它是否已經到達邊界。

這比通常的圓/矩形碰撞問題稍微複雜一些。我對如何做到這一點有一個模糊的想法 - 基本上在當前位置和新位置之間創建一個邊界矩形,這會產生一系列它自己的問題(由於矩形根據圓的方向旋轉速度)。但是,我認爲這是一個普遍的問題,而且一個通用的解決方案已經存在。

這種問題是否有共同的解決方案?也許我應該研究一些基本理論?

回答

5

既然你只有一個圓形和一個矩形,它其實很簡單。在尺寸爲w, h的矩形內彈跳的半徑爲r的圓可視爲與圓的中心處的點p相同,在矩形(w-r), (h-r)內。

現在位置更新變得簡單。考慮到你的觀點x, y和每幀速度dx, dy,更新後的位置是x+dx, y+dy - 除非你穿過邊界。比如說,如果你最終x+dx > W(讓W = w-r),那麼你做到以下幾點:

crossover = (x+dx) - W // this is how far "past" the edge your ball went 
x = W - crossover // so you bring it back the same amount on the correct side 
dx = -dx // and flip the velocity to the opposite direction 

,類似的還有y。您必須爲每個維度中的相反邊界設置類似(反映)的檢查。

+0

哇,我真的超越了這個。 – 2010-05-03 16:54:30

0

在每一步,您都可以計算下一幀的圓的投影/期望位置。

如果這位於矩形之外,則可以使用從舊圓位置到矩形邊緣的距離,以及下一個位置位於(相互穿透)的矩形邊緣的「過去」線性內插和確定圓圈「擊中」矩形邊緣的精確時間。例如,如果圓圈距離矩形邊緣10個像素,則預測會移動到5個像素以外,您知道對於2/3rds的時間步長(10/15),它會在其原始位置移動路徑,然後反映並繼續其剩餘1/3的時間步長(5/15th)的新路徑。通過計算動議的這兩部分並將翻譯「添加」在一起,您可以找到正確的新位置。 (當然,如果你碰到一個角落,它會變得更加複雜,因爲在時間步中可能有幾個碰撞,從不同的邊緣移開。如果你有多於一個圓圈移動,情況會變得更加複雜。但這就是你可以從你所問的案例開始的地方)

0

跨矩形邊界的反射非常簡單。只需取對象通過邊界的量並從邊界位置中減去它。例如,如果沒有反射的位置是(-0.8,-0.2),而左上角是(0,0),則反射位置是(0.8,0.2)。