- 創客智能電子制作
- 《無線電》編輯部
- 929字
- 2021-01-06 18:06:12
2.2 彈道的計算
第二個問題就是彈道的模擬了。一般情況下,各類游戲引擎就是專門用來計算這個的,可是我需要的僅僅是簡單的2D拋物線計算而已,完全沒必要興師動眾地去移植一款大型的游戲引擎,所以就自己動手寫一個吧。
首先在不考慮空氣阻力的理想情況下簡化土豆拋射運動,如圖2.4所示。

圖2.4 在不考慮空氣阻力的理想情況下簡化的土豆拋射運動
如果土豆不是垂直向上發射,而是與地平面呈φ角度射出,那么,這物體會按照拋物線軌跡移動,它的水平運動與垂直運動可以通過下式計算。

其中,R代表土豆的拋射距離,v0代表拋射的初速度。
如果假設土豆是以初速度50m/s,與地平面呈30°角射出。根據公式,不考慮任何干擾因素,它會飛到220.7m遠的地方。如果真砸到怪獸,估計會很痛。
以上是假設了一個具體數字來幫助大家理解。在這個游戲程序中,我們需要解決的問題就是如何寫一個程序來計算任意φ時的土豆運動軌跡。一旦這個土豆在某時刻的位置達到怪獸的邊界坐標內,那么即說明怪獸被擊中;否則當土豆運動到0高度時,則說明碰撞到地面,沒有擊中目標。
為了能讓程序實時地計算出土豆的位置,我們回顧一下那個遺忘了很多年卻又十分神奇的牛頓定律。通常線性的運動方程表示如下。
F=mdv/dt
換個形式讓它可以被積分
dv/dt=F/m
dv=(F/m)dt
可以認為速度上的無窮小的變化量dv等于(F/m)乘以時間無窮小的變化量。可是在計算機中我們是無法讓時間無窮小的,因此我們只能取一個較小的離散時間增量Δt,那么Δv就可以通過下式表示。
Δv=(F/m)Δt
Δv是在離散的時間片段內速度的改變值,因此當前的速度取決于之前的速度與速度變化之和。
v(t)+Δv=v(t)+(F/m)Δt
在初始條件下,vt為土豆離開炮筒時的速度。同理,位置的計算也可以用類似的方法表示。對于風力的影響,我們可以把它簡化為在水平方向上的恒定加速度,然后用與垂直方向相同的方法來處理。
經過這樣的轉化和簡化,以上微分方程問題就適合數字計算機來計算了,這就是游戲引擎中常用的所謂“歐拉積分法”。雖然這種方式的計算精度不高,只是對函數曲線進行了多邊形近似,但是如果把離散時間盡量取得小一些,對付這種簡單的小游戲還是綽綽有余了。搞明白了上面的內容,相關代碼就簡單了。我們只摘錄其中最需要說明的部分。


在精心地調整各項參數之后,彈道的模擬效果還是比較滿意的。