碰撞檢測教程(C++)_第1頁
碰撞檢測教程(C++)_第2頁
碰撞檢測教程(C++)_第3頁
碰撞檢測教程(C++)_第4頁
碰撞檢測教程(C++)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

碰撞檢測教程(C++)碰撞檢測教程(C++)碰撞檢測教程(C++)碰撞檢測教程(C++)編制僅供參考審核批準(zhǔn)生效日期地址:電話:傳真:郵編:簡介本文是闡述如何在2D動作游戲中進行精確而高效的碰撞檢測。這里的碰撞是基于多邊形而不是基于精靈的。這兩者之間在設(shè)計上會有不同?;诰`的碰撞檢測是通過精靈之間的重疊的像素來完成的。而多邊形使用向量數(shù)學(xué)來精確計算交點,時間和碰撞方向。雖然多邊形僅僅是精靈的一個近似,但是它比精靈系統(tǒng)要高級。可以精確模擬逼真的簡單物理學(xué),例如反彈,摩擦,斜面的滑行碰撞檢測可以更精確的用于高速精靈系統(tǒng)。在基于精靈的系統(tǒng)中,如果物體移動過快就會在跳過另一個物體?;谙蛄繑?shù)學(xué)因此可以擴展到3D,然而精靈碰撞系統(tǒng)被嚴(yán)格限制在2D的情況下。特性本文使用的算法只適用于凸多邊形,例如三角形,四邊形,六邊形,圓形。對于非凸多邊形,你可以將其分解為多個凸多邊形,例如三角形。算法可以用于快速移動或慢速移動的多邊形。不管物體移動多快,碰撞都不會丟失。它也可以處理重疊的問題,并促使交疊物體分離。演示也支持分割多邊形交叉。這可以用于子彈的建模。同時提供了簡單的物體系統(tǒng),彈力,一些基本的摩擦和靜摩擦力。用于確保物體不會從斜面上滑落。有一個剛體系統(tǒng)的例子,使用了ChrsiHecker的物理教程。限制有序碰撞。就是說并不是有序的進行碰撞。這對于快速移動的物體會出現(xiàn)一定的問題。一旦碰撞被檢測到,它就被直接處理了。理想狀態(tài)下你可能需要找到一個碰撞點并處理它,然后尋找更多的碰撞。但是對于2D動作游戲,這通常是不必要的。一、分離坐標(biāo)軸方法這個方法是碰撞檢測的核心。它的規(guī)則非常簡單并且非常易于實現(xiàn)。這個方法也非??觳⑶曳浅?煽?,因為計算中沒有使用除法操作,下面給出一個簡單的基于兩個BOX的碰撞檢測的例子。算法試圖在兩個物體之間找到一個合適平面,如果這個平面存在,那么物體就沒有相交。為了測試物體是否是分開的,簡單的方法是投影這個物體到平面的法線上,并比較兩者之間的間距看二者是否重疊。顯然有無數(shù)的平面可以用來分割兩個物體。但是已經(jīng)經(jīng)過證明的是:你只需要使用一部分平面來進行測試,對于BOX從上圖中可以看出平面的法線為BOXB的長軸。對于BOX來說需要測試的分割平面是那些法線等于兩個BOX的軸向的平面。因此對于兩個BOX來說,你只需要測試4個分割平面即可。在這四個平面里,一旦發(fā)現(xiàn)一個分割平面可以分割BOX那么你就可以斷定這兩個BOX是不相交的。如果四個平面都不能分割BOX,那么這兩個BOX一定是相交的,也就是出現(xiàn)了碰撞??梢詳U展這個算法到普通的多邊形,算法是相同的,只用需要測試的平面的數(shù)量改變了。并且分割平面在每個多邊形邊的垂直方向上又有一個法線。在下圖中,你可以看到兩個分割平面用于測試。在紅色的平面上你可以看到兩個間隔是重疊的。然而,在藍色的平面上間隔是不重疊的,因此,藍色的平面的是分割平面,因此物體是不相交的?,F(xiàn)在,我們有一個算法來檢測兩個多邊形是否是相交的。代碼可以分為三個部分:a) 生成需要測試的分離軸b) 計算每一個多邊形在分離軸法線上的投影c) 檢測這些投影是否相交boolIntersect(PolygonA,PolygonB){for(I=0;I<;I++){VectorN=Vector[I].y,[I].x);if(AxisSeparatePolygons(N,A,B))returnfalse;}for(I=0;I<;I++){VectorN=Vector[i].y,[I].x);if(AxisSeparatePolygons(N,A,B))returnfalse;}returntrue;}voidCalculateInterval(VectorAxis,PolygonP,float&min,float&max){floatd=Axisdot[0];num_vertices;J=I,I++){

VectorE=[I]-[J];Axis[iNumAxis++]=Vector,;if(AxisSeparatePolygons(N,A,B))returnfalse;}for(J=B.num_vertices-1,I=0;I<;J=I,I++){

VectorE=[I]-[J];Axis[iNumAxis++]=Vector,;if(AxisSeparatePolygons(N,A,B))returnfalse;}

ormalise();N))*N理想狀態(tài)下,碰撞前后粒子的能量是相同的。但是我們可以給粒子的碰撞加入彈性系數(shù)V’=V-((1+elasticity)*(V.N))*N彈性系數(shù)的范圍為[0,1]如果為零意味著粒子將沿著平面滑動,如果為1,粒子將沒有能量損耗的彈開。同樣我們可以加入一些摩擦。如果我們沿著碰撞的法線和碰撞平面方向分解速度,我們可以同時計算彈性系數(shù)和摩擦力。這里,速度被沿著平面的法向和平面分解。彈性系數(shù)將影響沿著平面法向的響應(yīng)(Vn),摩擦力將影響速度的切向(Vt)。同樣摩擦系數(shù)的范圍為[0,1].0意味著沒有摩擦力,1意味著粒子將突然停止。Vn=(V.N)*N;Vt=V-Vn;V’=Vt*(1-friction)+Vn

*-(elasticity);對于靜摩擦力,簡單地在速度Vt小于給定的值時設(shè)置Vt為(0,0),或者設(shè)置摩擦系數(shù)稍微比1大?,F(xiàn)在,計算兩個物體間的碰撞響應(yīng)。原理是相同的。然而,計算是基于物體的相對速度的,物體將象上述一樣受到影響。結(jié)果將添加到每一個物體上?,F(xiàn)在我們需要修改一下系數(shù),因為現(xiàn)在我們使用了相對的概念VectorV=Va-Vb;N)*N;Vt=V-Vn;if()<friction=; ||表示求模運算。在2D中表示向量的長度??梢允褂孟旅娴墓礁鶕?jù)組成多邊形材質(zhì)的密度來計算慣量這里:P是密度,N是頂點數(shù),Pn是多邊形的頂點,||..||表示求模,從上述方程中,你可以推理出計算質(zhì)量的等式。該系統(tǒng)的其它模式是處理交疊。這可以避免一個物體陷入另一個物體,因為使用推力計算在低速的時候是非常不精確的。為了解決交疊問題,即簡單的方法是沿著碰撞法線根據(jù)碰撞深度將物體推開。當(dāng)然只有在檢測到交疊的時候才使用它。?為了使它更為精確,物體的移動應(yīng)該依賴于它們質(zhì)量的比率,因此較輕的物體應(yīng)該移動更多,而較重的物體移動較少,當(dāng)然具有無窮大質(zhì)量的物體是不會移動的。?至于摩擦力,基本的是動態(tài)摩擦力,它將沿著物體速度的反向添加一個力,大小為||u*Jn||其中u是動摩擦系數(shù)Jn是壓力。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論