1. 程式人生 > >遊戲中的數學與物理(一)

遊戲中的數學與物理(一)

(看了《遊戲開發的數學與物理》,感覺很不錯,記下點東西。 這是本“圖靈程式叢書”,對於這個系列的書,我一直是蠻喜歡的,感覺書的內容、排版等,都讓人看著很舒服。)

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——重複使用尤拉法,比較常用。