2010-02-06 73 views
3

我在繞過如何計算2D空間中的移動圓的法線方面遇到了困難。我已經儘可能地計算出了物體的速度法線(方向速度),但這正是我的大學代數思維過熱的地方,我正在與我一起工作的二維圓圈中心點,半徑,速度和位置。XNA碰撞檢測 - Vector2.Reflect - 幫助計算圓形精靈的法線 - C#

最終,我想使用Vector2.Reflect方法來獲得一點這個練習中更真實的物理。

提前致謝。

編輯:添加了一些代碼嘗試建議(沒有用),可能會誤解建議。我在這裏使用籃球和棒球,因此使用籃球和籃球。我也有位置和速度,它被添加到位置來創建運動。

if ((Vector2.Distance(baseMid, basketMid)) < baseRadius + basketRadius) 
{ 
    Vector2 baseNorm = basketMid - baseMid; 
    baseNorm.Normalize(); 
    Vector2 basketNorm = baseMid - basketMid; 
    basketNorm.Normalize(); 
    baseVelocity = Vector2.Reflect(baseVelocity, baseNorm); 
    basketVelocity = Vector2.Reflect(basketVelocity, basketNorm); 
} 

basePos.Y += baseVelocity.Y; 
basePos.X += baseVelocity.X; 
basketPos.Y += basketVelocity.Y; 
basketPos.X += basketVelocity.X; 
basketMid = new Vector2((basketballTex.Width/2 + basketPos.X), (basketballTex.Height/2 + basketPos.Y)); 
baseMid = new Vector2((baseballTex.Width/2 + basePos.X), (baseballTex.Height/2 + basePos.Y)); 

回答

5

首先反思。如果我正確讀取代碼,則Vector2.Reflect的第二個參數是曲面的法線。水平地面的法線爲(0,1),速度爲(4,-3)的球擊中並以速度(4,3)飛走。是對的嗎?如果這不正確,那麼我們將不得不改變if語句的主體。 (注意,你可以通過設置basketNorm = -baseNorm來節省一些週期。)

現在物理。正如所寫的,當兩個球碰撞時,每個球都會彈起,好像它碰到了一個與兩個球體相切的玻璃壁,這是不現實的。想象一下打檯球:一個快速的紅球打到一個固定的藍球死點。紅球是否會反彈並將藍球留在原地?不,藍色的球被擊倒,紅色的球失去了大部分的速度(全部,完美的情況)。炮彈和高爾夫球如何以相同的速度向相反的方向移動,迎面碰撞。他們會同時彈跳嗎?不,炮彈將繼續,幾乎沒有注意到的影響,但高爾夫球會反轉方向,並飛走比它來得快。爲了理解這些碰撞,你必須瞭解動量(如果你想碰撞不是完全彈性的,就像豆袋碰撞時一樣,你也必須瞭解能量)。一本基礎物理教科書將在早期的章節中介紹。如果你只是希望能夠模擬這些東西,使用質心 - 框架:

 
Vector2 CMVelocity = (basket.Mass*basket.Velocity + base.Mass*base.Velocity)/(basket.Mass + base.Mass); 

baseVelocity -= CMVelocity; 
baseVelocity = Vector2.Reflect(baseVelocity, baseNorm); 
baseVelocity += CMVelocity; 

basketVelocity -= CMVelocity; 
basketVelocity = Vector2.Reflect(basketVelocity, basketNorm); 
basketVelocity += CMVelocity; 
+0

我真的很感謝這個補充,但問題是代碼在這個問題上不起作用。我無法嘗試添加彌撒,直到我得到上述工作。 – user48202 2010-02-11 21:18:39

+0

你能更具體嗎?它編譯失敗嗎?當球關閉時if語句不能觸發,或當球離得很遠時觸發if語句?球不能直線移動嗎?他們是否以一種奇怪的方式反彈? (這是C++,對不對?) – Beta 2010-02-12 21:39:59

+0

這是C#,因爲它是XNA。 – kyoryu 2010-02-15 04:28:06

1

在其邊緣給定點處的圓的法線將成爲從其中心到該點的方向。假設你在這裏與圓形碰撞一起工作,那麼一個簡單的「速記」方法就是在碰撞時(當圓圈觸摸時),以下將成立:

讓A是一個圓的中心,B是另一個的中心。圓A的法線正常化(B-A),圓B的法線正常化(A-B)。這是事實,因爲他們接觸的點總是與兩個圓的中心共線。

+0

我要一點點的代碼添加到原來的問題,說明什麼,我試圖完成。謝謝,我知道從邏輯上理解一個正常的東西,但是如何計算它以及哪個矢量應該在Vector2.Reflect的第一個插槽中仍然不清楚。對不起,當談到這些東西時,我有點緊張。 – user48202 2010-02-06 07:00:01

0

警告:我不會認爲這是完全正確的。物理學不是我的專業。

運動對正常沒有影響。典型地,法線僅僅是指示方向的標準化(長度爲1)的矢量,典型地爲poly在3d對象上面臨的方向。

我想你想要做的是找到兩個圓圈之間的碰撞正常,是嗎?如果是這樣,球體的一個很酷的屬性是,如果你找到它們的中心之間的距離,你可以規範化它以得到球體的法線。

什麼似乎正確的2d物理學是你取一個球體的速度*質量(能量),並乘以歸一化的向量到另一個球體。將結果添加到目標球體的能量中,從原始球體的能量中減去該能量,然後按質量單獨劃分每個球體得到所得的速度。如果其他球體正在移動,請按相反方向操作。當然,你可以簡化數學運算,但是現在已經晚了,我不想這樣做:)

如果兩個球體都在移動,爲其他球體重複這個過程(儘管你可能會簡化該方程得到一些更有效的數學)。

這只是餐後數學,但它似乎給出了正確的結果。而且,嘿,我曾經自己推導出歐拉角,所以有時候我的餐後數學算法實際上是成立的。

這也假設有完美的彈性碰撞。

如果我是不正確的,我很樂意找出:)

+0

那麼,物理類*是我的專業,雖然我很佩服你的創造力,但你犯了一些錯誤。首先,您似乎將矢量添加到標量(無方向量),這是傳統上不允許的。下一句話是不清楚的(加上這個,從那個減去,然後除* *呵呵?),似乎減少到A-(A + B)。這將在一些非常特殊的情況下工作,但只在那裏。如果你想獲得一些樂趣,可以嘗試一些1d的碰撞,比如我的答案中的例子,並嘗試找到一個可行的方法。沒有什麼比解決大自然的難題之一了! – Beta 2010-03-08 22:11:11

+0

@Beta:感謝您的反饋:) – kyoryu 2010-03-09 02:57:37