摘 要:該文改進(jìn)了傳統(tǒng)的區(qū)域檢測(cè)碰撞算法不能檢測(cè)處于不同高度的運(yùn)動(dòng)小球是否發(fā)生碰撞的狀況,通過(guò)比較兩球圓心距與其半徑和的大小,分析并設(shè)計(jì)實(shí)驗(yàn)來(lái)檢測(cè)兩球在不同高度上是否發(fā)生碰撞,但由于采集圖片的問(wèn)題以及球的半徑不夠精確,會(huì)出現(xiàn)兩球并未真正發(fā)生碰撞卻檢測(cè)出碰撞的結(jié)果。實(shí)驗(yàn)最終可以
檢測(cè)兩運(yùn)動(dòng)小球在不同高度上是否發(fā)生碰撞。
關(guān)鍵詞:區(qū)域碰撞;高度
中圖分類(lèi)號(hào):TP312.1-4
在簡(jiǎn)單的游戲設(shè)計(jì)中,我們總會(huì)不可避免的使用到球類(lèi)物體,在對(duì)兩個(gè)運(yùn)動(dòng)小球做區(qū)域檢測(cè)碰撞時(shí),由于傳統(tǒng)的區(qū)域檢測(cè)只能檢測(cè)到兩個(gè)小球在相同高度上是否發(fā)生碰撞,即判斷兩個(gè)小球圖片長(zhǎng)度是否已經(jīng)相交,若相交,則說(shuō)明發(fā)生了碰撞。但是,當(dāng)小球處于不同高度時(shí),運(yùn)用該方法則會(huì)產(chǎn)生錯(cuò)誤。
基于上訴問(wèn)題,本文設(shè)計(jì)了檢測(cè)不同高度的小球在發(fā)生碰撞時(shí)的算法。即通過(guò)比較兩球圓心距與其半徑和的大小,當(dāng)圓心距小于半徑和時(shí)即檢測(cè)為碰撞,從而克服了區(qū)域檢測(cè)碰撞中的高度限制,而且實(shí)驗(yàn)中實(shí)現(xiàn)了多次檢測(cè)碰撞,即兩球球心連線與水平線成不同角度時(shí)分別檢測(cè)碰撞結(jié)果,使得碰撞檢測(cè)更為全面。
1 數(shù)學(xué)模型
如圖1、圖2所示,傳統(tǒng)的區(qū)域檢測(cè)中,兩個(gè)小球處于同一高度,對(duì)其檢測(cè)碰撞,只需判斷圖片長(zhǎng)度是否已經(jīng)相交。換言之,僅僅判斷左邊小球圖片的左上角的x坐標(biāo)與左邊小球的圖片長(zhǎng)度是否大于右邊小球圖片的左上角的x坐標(biāo)即可。若大于,表示兩球發(fā)生碰撞,反之未發(fā)生碰撞。
上述數(shù)學(xué)模型只能檢測(cè)到水平線上發(fā)生的碰撞,為了使碰撞檢測(cè)更全面,設(shè)計(jì)了以下數(shù)學(xué)模型。如圖3、圖4,通過(guò)比較兩球的圓心距與其半徑和的大小來(lái)作為其是否發(fā)生碰撞的標(biāo)準(zhǔn),換言之,假設(shè)兩球中一球圓心坐標(biāo)為(x,y),另一球圓心坐標(biāo)為(m,n),且其半徑大小均為r,p,則當(dāng)其球心距小于其半徑和時(shí),則檢測(cè)為碰撞,以下為其圖片及具體公式:
2 檢測(cè)結(jié)果及分析
本實(shí)驗(yàn)刻畫(huà)了兩個(gè)小球,球A垂直方向做勻速運(yùn)動(dòng),水平方向上以每次50單位的速度向右移動(dòng),球B沿對(duì)角線方向從左向右運(yùn)動(dòng),這樣保證了兩球一定能夠發(fā)生碰撞,一旦兩球球心距小于其半徑和時(shí)即檢測(cè)為碰撞,當(dāng)兩球發(fā)生碰撞后,靜止兩秒,繼續(xù)按照原來(lái)的運(yùn)動(dòng)軌跡運(yùn)行,當(dāng)A球超出右邊邊界時(shí)實(shí)驗(yàn)結(jié)束,這樣設(shè)計(jì)是為了可以多次檢測(cè)到不同方位的碰撞。如圖5、圖6所示,小球在運(yùn)動(dòng)過(guò)程中均能檢測(cè)出碰撞。
為了消除隨機(jī)性,圖7、圖8顯示了兩個(gè)小球在垂直方位和斜對(duì)角方位也檢測(cè)到碰撞,從而證明該算法可以檢測(cè)到兩球在不同位置發(fā)生碰撞的過(guò)程。
以下為兩球處于不同位置時(shí)發(fā)生碰撞的圖片
圖5 檢測(cè)碰撞 圖6 檢測(cè)碰撞
圖7 檢測(cè)碰撞 圖8 檢測(cè)碰撞
在整個(gè)過(guò)程中,由于圖片采集以及球的半徑不夠精確的原因,可能會(huì)出現(xiàn)兩球并未相撞但檢測(cè)為碰撞的情形,如下:
圖9 發(fā)生不精確的檢測(cè)
3 結(jié)束語(yǔ)
本文通過(guò)比較兩球圓心距與其半徑和的大小,分析并設(shè)計(jì)實(shí)驗(yàn)來(lái)檢測(cè)兩球在不同高度上是否發(fā)生碰撞,解決了區(qū)域檢測(cè)碰撞不能實(shí)現(xiàn)檢測(cè)運(yùn)動(dòng)小球在不同高度上是否發(fā)生碰撞的情況,使得檢測(cè)更加靈活。
但是,該實(shí)驗(yàn)暫且只適合于規(guī)則形狀、取得其范圍大小的球類(lèi)物體,但是經(jīng)常會(huì)遇到不規(guī)則的圖形,為了節(jié)約碰撞檢測(cè)的時(shí)間,若在允許范圍內(nèi)仍采用區(qū)域檢測(cè)碰撞。
參考文獻(xiàn):
[1]肖永亮.Visual C++游戲編程基礎(chǔ)[M].北京:電子工業(yè)出版社,2005.
[2]范昭煒.實(shí)時(shí)碰撞檢測(cè)技術(shù)研究[D].浙江大學(xué),2003.
[3]肖永亮.計(jì)算機(jī)游戲程序設(shè)計(jì)[M].北京:電子工業(yè)出版社,2005.
[4]葉展,葉丁.游戲的設(shè)計(jì)與開(kāi)發(fā)[M].北京:人民交通出版社,2003.
[5]鮑虎軍,金小剛,彭群生.計(jì)算機(jī)動(dòng)畫(huà)算法基礎(chǔ)[M].北京:科學(xué)出版社,2000.
[6]Addrew Rollings,Dave Morris.Game Architecture and Design.the Coriolis Group,2000.
[7]Charles Petzold.Programming Windows.Microsoft,1998.
[8]Jim Blinn,Jim Blinn’s Corner.A Trip Down the Graphics Pipeline.Morgan-Kaufmann,1996.
[9]Direct X 9.0 SDK.Microdift Cooperation,2003.
[10]Daniel Sanchez-Crespo Dalmau.Core Techniquesn and Algorithms in Game Programming.New Riders Publishing,2003.
作者簡(jiǎn)介:萬(wàn)夢(mèng)玉(1991-),女,山東泰安人,本科;張夢(mèng)琪(1993-),女,四川成都人,本科。
作者單位:四川大學(xué) 軟件學(xué)院,成都 610207