謝吉?jiǎng)?/p>
(南京工業(yè)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)與軟件學(xué)院,江蘇南京,210023)
快速移動(dòng)目標(biāo)的瞄準(zhǔn)算法和程序?qū)崿F(xiàn)
謝吉?jiǎng)?/p>
(南京工業(yè)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)與軟件學(xué)院,江蘇南京,210023)
在塔防游戲中,對(duì)于飛機(jī)等快速移動(dòng)且距離較遠(yuǎn)的目標(biāo),火炮直接向目標(biāo)射擊是不可能命中的。本文在分析炮彈和飛機(jī)的運(yùn)動(dòng)情況的基礎(chǔ)上,提出逐次迭代逼近的方法求解命中點(diǎn),并將世界坐標(biāo)系轉(zhuǎn)換到火炮坐標(biāo)系以簡(jiǎn)化求解過(guò)程,使火炮能夠快速指向命中點(diǎn),最后文章給出了主要的程序?qū)崿F(xiàn)步驟。
瞄準(zhǔn);迭代;坐標(biāo)變換
在一般塔防游戲中,常有大炮跟隨目標(biāo)自動(dòng)瞄準(zhǔn)的設(shè)計(jì)。在Unity中有l(wèi)ook at腳本,即火炮始終指向目標(biāo),開(kāi)火時(shí)直接朝目標(biāo)點(diǎn)射擊。該腳本在地面近距離、目標(biāo)移動(dòng)速度慢時(shí)有很高的命中率。但是如果是模擬飛行射擊游戲,由于飛機(jī)飛行速度快,大炮與飛機(jī)距離比較遠(yuǎn),重力影響也比較大,這時(shí)就很難命中目標(biāo),需要對(duì)瞄準(zhǔn)程序進(jìn)行改寫(xiě)。下面以飛機(jī)作勻速直線(xiàn)運(yùn)動(dòng)為前提,具體討論該問(wèn)題的處理方法。
如圖1,火炮位置為T(mén),飛機(jī)初始位置為P已知,H為預(yù)計(jì)命中點(diǎn)。飛機(jī)飛行方向和飛行速度vP已知,炮彈出膛速度vT已知,這時(shí)炮彈將會(huì)作拋物線(xiàn)運(yùn)動(dòng)。
此時(shí)飛機(jī)的運(yùn)動(dòng)方程為:
xP=xP0+vPxt
yP=yP0+vPyt
zP=zP0+vPzt
炮彈的運(yùn)動(dòng)方程為:
xT=xT0+vTxt
yp=yT0+vTyt-
zp=zT0+vTzt
其中g(shù)為重力加速度,t為飛行時(shí)間。
圖 1 飛機(jī)和炮彈的運(yùn)動(dòng)示意圖
這是個(gè)非齊次非線(xiàn)性隱含微分方程組,用常規(guī)的迭代逼近求解,迭代的過(guò)程大致思路如下:首先預(yù)測(cè)一個(gè)可能得命中位置,一般可以選飛機(jī)的初始位置為第一個(gè)預(yù)測(cè)命中位置,計(jì)算炮彈飛到該位置的時(shí)間t和發(fā)射角θ。根據(jù)該時(shí)間計(jì)算飛機(jī)在該時(shí)刻的實(shí)際位置,然后以該位置作為第二次的預(yù)測(cè)值再次計(jì)算,以此使炮彈落點(diǎn)不斷逼近飛機(jī)位置,直到兩者差距小于某一個(gè)特定值。該算法流程圖如圖2。
圖 2 算法流程圖
考慮到拋物線(xiàn)本身是一個(gè)2D曲線(xiàn),做一個(gè)坐標(biāo)變換,每一次迭代將世界坐標(biāo)系將變換為以火炮位置為原點(diǎn),x軸正向指向預(yù)測(cè)命中點(diǎn)的火炮坐標(biāo)系,即可將問(wèn)題簡(jiǎn)化為只考慮X,Y方向的2D問(wèn)題。發(fā)射角只要計(jì)算火炮與x軸的夾角θ,待算出最后結(jié)果后再轉(zhuǎn)換回世界坐標(biāo)系即可。如圖3,虛線(xiàn)描述的是火炮坐標(biāo)系,實(shí)線(xiàn)為世界坐標(biāo)系。
圖 3 坐標(biāo)變換圖
變換后的拋物線(xiàn)方程可以改寫(xiě)為:
代入后得出
求解得出:
這樣發(fā)射角θ就可以通過(guò)預(yù)測(cè)的落點(diǎn)坐標(biāo)、炮彈初速度、重力加速度g來(lái)求出。
下面例舉出炮彈實(shí)例的生成和坐標(biāo)變換的主要代碼。具體實(shí)現(xiàn)過(guò)程主要是數(shù)學(xué)公式的實(shí)現(xiàn),此處從略。
3.1生成炮彈實(shí)例
首先在Unity中制作預(yù)制剛體——炮彈,命名為shell_ prb。如果方程有解,也就是炮彈可能命中的情況下生成該實(shí)例。
if(hitPoint != Vector3.zero){
GameObject obj = (GameObject)Instantiate(shell_ prb,gun.transform.position,Quaternion. LookRotation(hitPoint));
}
3.2坐標(biāo)變換
構(gòu)造一個(gè)以炮塔為原點(diǎn),以重力方向?yàn)?y軸 以炮塔正前方為X軸的標(biāo)準(zhǔn)拋物線(xiàn)2D坐標(biāo)系,再構(gòu)造從世界坐標(biāo)到炮塔坐標(biāo)的旋轉(zhuǎn)矩陣,最后計(jì)算相對(duì)坐標(biāo)差,再旋轉(zhuǎn)到炮塔當(dāng)前坐標(biāo),完成世界坐標(biāo)系到火炮坐標(biāo)系的變換。
Vector3 gunDirection = new Vector3(hitPoint. x,gunPosition.y,hitPoint.z) - gunPosition;
Quaternion gunRotation = Quaternion.FromToRatation(gunDirection,Vector3.forward);
Vector3 localHitPoint = gunRotation * (hitPoint -gunPosition);
float V = gunVelocity;
float X = localHitPoint.z;
float Y = localHitPoint.y;
實(shí)驗(yàn)表明,本算法在幾千米范圍以?xún)?nèi)的飛機(jī),飛行速度在幾百千米每小時(shí),炮彈出膛速度在幾百米每秒,命中精度10m以?xún)?nèi)的前提下,基本上4-6次迭代以?xún)?nèi)可以完成,能夠達(dá)到應(yīng)有的響應(yīng)速度,另外如果采用無(wú)重力情況下的直線(xiàn)彈道計(jì)算出來(lái)的命中點(diǎn)為首次預(yù)測(cè)點(diǎn),能夠使迭代效率更高。在此基礎(chǔ)上如果再考慮進(jìn)空氣阻力、飛機(jī)的變速飛行等因素的影響,就可以簡(jiǎn)單的實(shí)現(xiàn)軍事仿真系統(tǒng)。
[1] 宣雨松. Unity 3D游戲開(kāi)發(fā)[M]. 北京:人民郵電出版社2012,6: 176-178
[2] 劉光然. 虛擬現(xiàn)實(shí)技術(shù)[M] . 北京:清華大學(xué)出版社2011,1:22-24
[3] 同濟(jì)大學(xué)數(shù)學(xué)系. 高等數(shù)學(xué)[M]. 北京:高等教育出版社2007,4:323-325
[4] Michelle Menard(美)著 史曉明,李強(qiáng) 譯. Unity游戲開(kāi)發(fā)實(shí)戰(zhàn)[M]. 北京:機(jī)械工業(yè)出版社 2012,4:89-90
Realization of Algorithm and Program to Aim at the Quickly-moving Object
Xie Jigang
(Nanjing Institute of Industry Technology,Nanjing 210023,China)
In tower defense game,it’s impossible for the artillery to hit directly the objects which are moving quickly and in faraway distance such as aircraft.Based on the analysis of artillery and aircraft movement,the article put forward the method of successive iteration approximation to get the impact point,as well as the transformation from the world coordinate system to artillery coordinate system to simplify the solution process.Using this method,the artillery can quickly point to the impact point.This article also gives the implementation steps of main programs.
aim at;iteration;coordinate transformation
謝吉?jiǎng)偅?975-),男,四川內(nèi)江人,南京工業(yè)職業(yè)技術(shù)學(xué)院,副教授,理學(xué)碩士。主要研究方向:計(jì)算機(jī)多媒體技術(shù)。
基于Unity 3D的角色扮演游戲設(shè)計(jì)與開(kāi)發(fā),南京工業(yè)職業(yè)技術(shù)學(xué)院2014年度重點(diǎn)科研課題(編號(hào): YK14-04-06)