1. 程式人生 > >Box2D C++ tutorials

Box2D C++ tutorials

Intro:

    有個問題經常被提及到:“當一個物體被拋起或者發射到空中時,我要怎麼知道它的執行軌跡     1.它的行進路徑是怎樣的?     2.它可以達到的最大高度     3.物體會以多快的速度達到預想的高度     4.它會碰撞到什麼東西     5.它會反彈到什麼?     下面的情況下需要知道物體的運動軌跡,當玩家控制一個拋射的物體時,玩家想要知道它的虛擬軌跡來顯示它接下來的執行情況,而且當電腦將要去操縱一個物體時,也需要一個虛擬的運動軌跡來讓下面的事變得清晰。     有兩種辦法可以預先知道物體的執行軌跡:一個是用公式去計算接下來的物體位置,或者用box2d的世界來模擬下面的步驟,下面先向我們快速地瀏覽下這兩個辦法:     用公式的辦法最明顯的優點是它需要更少的運算時間,而且不要求複雜的世界狀態,但是它最明顯的缺點是,如果有另外一個動態的物體在這個世界裡面,用公式的辦法就不能準確地回答下面兩個問題:它會碰到哪個物體,而且長遠來看,我們要知道世界裡面所有的執行物體在後面的位置。     另一方面,用全模擬世界的方法確實可以解決上面所有的辦法,因為它知道螢幕裡面所有的物體在接下來的位置,但是它些資訊的得來是需要花費更多的時間。首先它肯定是要執行更多的操作任務,當用戶更改拋物線的軌跡,或者滑鼠移動更新了。
    (譯註:裡面叭啦叭啦一大堆就是講的是用公式的好處)     所以這篇文章就只講插入公式的辦法來預先顯示運動的軌跡。只要記住,如果你想知道這個執行的執行拋物線與其他所有動態物體的互動,那麼你就需要用世界來模擬所有的場景物體,但是在大多情況下,我想用公式的辦法就可以很好的顯示一個物體的預先軌跡或者用來給【AI】物體帶來一個智慧的判斷。     在我們開始講解之前,我們必須得認識到的是,這種公式的辦法只適用於用一個定長的時間來做。

The formula

    我們長話短說,這個拋物線的公式是:      說明:     我看到很多人很想知道,為什麼不直接給他們一個期望的結果,我想是因為他們忽略了一個很重要的點,那就是每一個在box2d裡面的物體在時間步上面都是一個分離開來的執行,你不能用一個確切的時間值插入到這個公式來計算一個位置值。

Drawing a projected trajectory

    我們來看第一段程式碼:
  b2Vec2 getTrajectoryPoint( b2Vec2& startingPosition, b2Vec2& startingVelocity, float n )
  {
      //velocity and gravity are given per second but we want time step values here
      float t = 1 / 60.0f; // seconds per time step (at 60fps)
      b2Vec2 stepVelocity = t * startingVelocity; // m/s
      b2Vec2 stepGravity = t * t * m_world->GetGravity(); // m/s/s
  
      return startingPosition + n * stepVelocity + 0.5f * (n*n+n) * stepGravity;
  }

    接下來我們要探討的問題是:

What will it hit?

    這裡面主要就是用raycast就可以了。

How high will it go?

    它會到達多高,