遊戲中的數學與物理(一)
阿新 • • 發佈:2019-02-15
(看了《遊戲開發的數學與物理》,感覺很不錯,記下點東西。 這是本“圖靈程式叢書”,對於這個系列的書,我一直是蠻喜歡的,感覺書的內容、排版等,都讓人看著很舒服。)
1.1讓物體沿水平方向運動
瞭解勻速直線運動(最簡單的運動),若左邊為x,速度為v,則:x+=v,v=-v。
注意: 注意物體的中心點,不同的遊戲引擎,可能設計的中心點不同,而中心點不同,邊界也就不同。
1.2通過鍵盤控制物體的運動
主要用到小學學的勾股定理,原理很簡單,而且很實用。
PS: 在模擬運動時,要控制個方向的速度。
1.3讓物體沿任意方向運動
注1:請將角的單位統一為弧度(主要關係到微積分的一些問題)。
注2:在計算浮點數中,計算機不可避免的會有誤差,絕對值越大誤差也就越大。因此應該儘可能地使用絕對值小的數字進行計算。
1.4在物體運動中加入重力
y += vy; //對位置加入速度
vy +=G; //為速度加上加速度
用此方法算的Vy與y分別是:
計算機所使用的重力加速度單位是特殊的 dot/F^2 (畫素/平方幀)
但是對於真實的情況,我們用積分模擬
這樣就和前面程式碼所表示的存在一些誤差,則程式碼應該改成:
v=vx*t; //x方向的位置 y=1/2*G*t*t+vy*t+y0; //y方向的位置
1.5物體隨機飛濺運動
隨機數、均勻隨機數、正態分佈 ——>火山噴發、煙花、摩擦迸出的火花。
產生隨機速度的部分:
Balls[i].vx = rand()*Screen_width/(float)RAND_MAX - Screen_width/2.0f; //vx的初始值
Balls[i].vy = rand()*Screen_height/(float)RAND_MAX - Screen_height/2.0f - Base; //vy的初始值
生成了均勻隨機數(所有數字的出現概率都相等的隨機數),其中,Screen_width 和 screen_height 分辨是螢幕的寬和高。而vx與vy生成的初始值的範圍分別為(-Screen_width/2.0 ~ Screen_width/2.0) 和 (-Base - Screen_height/2.0f ~ -Base+Screen_height/2.0)。1.6讓物體進行圓周角運動
x=R*cosf(fAngle)+(Screen_width-Char_width)/2.0f;
y=R*sinf(fAngle)+(Screen_Height-Char_height)/2.0f;
fAngle+=2.0f*PI/120.0f; //一週的時間為2min
所以物體施加一個指向某一點的角速度為ω的力,物體就會圍繞該點做圓周運動。
把t=0代入上面兩式得初始時間與速度:
//使用向心力的圓周運動,決定初始位置及初始速度的部分
rx=R;
ry=0.0f; //(r,0)
vx=0.0f;
vy=R*AngleSpeed; //(0,rw)
1.7[難]微分方程式及其數值解法
常用:微分方程的數學值解法; 尤拉法
但是球類等運動,需要更高精度,則有以下幾種方法
- 使用精度更高的高階近似求解微分方程,eg,Runge-Kutta methods 。(數學難)
- 使用線性多步法(Linear multistep method)計算,即不光使用前一次的值,還使用前兩次或更多次的值進行計算, eg,Adams-Bashforth等。
- 在一幀內多次使用尤拉法計算,縮小∆t——重複使用尤拉法,比較常用。