2014-03-24 20 views
3

我試圖檢測一個拋射物是否打到盾牌 - 碰撞發生在哪裏。檢測可能的拋射物與盾牌的碰撞

enter image description here

在此圖中,可以看到的局面。儘管AB的彈丸與盾牌中心S的距離大致相同,但其中一個將與盾牌相撞,而另一個則不會。

enter image description here

解決方案,簡單的數學會用圓的數學公式和彈丸路徑的直線的方程。

用筆和紙,我可以計算出來。但是,我直接實施解析幾何的經驗非常糟糕。

此外,這將返回正面的射彈離開盾牌。我如何過濾它們?

enter image description here

第二條本辦法,朋友的想法,是測量彈丸路徑和屏蔽中心之間的最小距離 - 如果lr較小,碰撞發生。

這似乎更容易實施,但不讓我知道碰撞發生在何處。

我在2個維度工作。我正在使用C#和Unity引擎,但是歡迎使用通用解決方案。

拋射物當然被認爲是零點大小的點。

+0

如果你做了正確的數學運算,並開始使用射線的原點和t次直方向矢量,那麼實際擊中圓圈的解將具有正的t。另一種方法也很好,你只需要爲光線和垂直於它的直線在圓的中心找出線條碰撞。你應該能夠計算l的入口和出口點(提示,它就像sqrt(1 - x^2))。 – masterxilo

回答

1

使用軌跡的參數方程:X= X0 + t.P + X0,Y = t.Q + Y0(從方向(P, Q)開始的(X0, Y0))。

插入到這個圓式(X - Xc)^2 + (Y - Yc)^2 = R^2,並獲得:

(t.P + Dx)^2 + (t.Q + Dy)^2 = (P^2+Q^2).t^2 + 2.(P.Dx+Q.Dy).t + Dx^2+Dy^2 = R^2. 

這是t一元二次方程。無論何時出現積極的根,都會觸及盾牌。

如果你的彈丸有非零半徑r,試想你將彈丸壓縮到0並將目標膨脹到R + r

1

你的屏蔽可以被描述爲:

(X - X1)^2 + (Y - Y1)^2 = R^2 

彈丸的線可以被描述爲:

Y - Y3 = ((Y4 - Y3)/(X4 - X3)) * (X - X3) 

從這裏,

Y = ((Y4 - Y3)/(X4 - X3)) * (X - X3) + Y3 

使用延伸的第一方程我們得到:

(X - X1)^2 + (((Y4 - Y3)/(X4 - X3)) * (X - X3) + Y3 - Y1)^2 = R^2 

這是一個quadratic equation,如果解決了這個問題,會給你交點的X值。閱讀二次方程解的鏈接,它將爲您提供第一個用單一公式解決問題的衝動。當然,如果判別式是否定的,那麼就沒有交集,因爲這個方程沒有真正的解決方案。如果判別式爲0,那麼拋射體只觸及盾牌,如果判別式爲正數,則用等式的解來得到入口X和出口X.

知道了值(一個或多個)X的,你可以用下面的公式計算Y的值(一個或多個):

Y = ((Y4 - Y3)/(X4 - X3)) * (X - X3) + Y3 

最後請注意,這隻有當彈丸的線不垂直,因爲那麼X4將與X3相等,這會使基本方程無用。因爲當彈丸穿過一條垂直線的情況下,該行的公式是:

X = X1 

,你可以使用的

Y = ((Y4 - Y3)/(X4 - X3)) * (X - X3) + Y3 

公式來獲得可能的解決方案(同樣,這是一個二次公式)

因此,實施應該檢查彈丸線是否垂直,你應該選擇相應的解決方案。我希望這對你有所幫助。

0

如果您製作了盾牌作爲GameObject,則可以使用Bounds來確定彈道的未來路徑是否包含在屏蔽區域內(Link to bounds)。計算射彈的未來路徑。然後通過使用來查看拋射體的任何未來點是否在盾的邊界內。如果是,那麼它會擊中。