Box2D C++ tutorials
阿新 • • 發佈:2019-02-06
Intro:
有個問題經常被提及到:“當一個物體被拋起或者發射到空中時,我要怎麼知道它的執行軌跡 1.它的行進路徑是怎樣的? 2.它可以達到的最大高度 3.物體會以多快的速度達到預想的高度 4.它會碰撞到什麼東西 5.它會反彈到什麼? 下面的情況下需要知道物體的運動軌跡,當玩家控制一個拋射的物體時,玩家想要知道它的虛擬軌跡來顯示它接下來的執行情況,而且當電腦將要去操縱一個物體時,也需要一個虛擬的運動軌跡來讓下面的事變得清晰。 有兩種辦法可以預先知道物體的執行軌跡:一個是用公式去計算接下來的物體位置,或者用box2d的世界來模擬下面的步驟,下面先向我們快速地瀏覽下這兩個辦法: 用公式的辦法最明顯的優點是它需要更少的運算時間,而且不要求複雜的世界狀態,但是它最明顯的缺點是,如果有另外一個動態的物體在這個世界裡面,用公式的辦法就不能準確地回答下面兩個問題:它會碰到哪個物體,而且長遠來看,我們要知道世界裡面所有的執行物體在後面的位置。 另一方面,用全模擬世界的方法確實可以解決上面所有的辦法,因為它知道螢幕裡面所有的物體在接下來的位置,但是它些資訊的得來是需要花費更多的時間。首先它肯定是要執行更多的操作任務,當用戶更改拋物線的軌跡,或者滑鼠移動更新了。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; }
接下來我們要探討的問題是: