Box2D 是一個開源的 C++ 2D 剛體物理引擎,包括了連續碰撞偵測、支點限制、摩擦力、齒輪等功能,可以模擬物體互動...... 的數值。它的核心本身不管畫面渲染,所以只會更新物體們的狀態;欲呈現出來,請自行調用任意繪圖函式庫,抓物件狀態數值出來畫......
所以那篇文章就用 Qt 繪圖框架結合 Box2D,弄了個漂亮的彩色小三角形下落模擬。由於我個人一看到 C++ 語法就開始覺得陣陣髮指兼蛋疼,所以把原文給的程式碼用 Python 改寫了。結果在這裡 ( 備份 )。
測試通過的環境:
ArchLinux | |
Python | 2.7.1 |
Box2D | 2.1.2 |
PyBox2D | svn |
PyQt | 4.8.2 |
描述一下寫簡單 Box2D 2.0 程式的觀念,希望沒有錯誤:
- 物體由 b2Body 儲存其位置、線性速度、角度、角速度、阻尼等數值。
- 另由 b2PolygonShape / b2CircleShape 儲存實際碰撞面積、密度、摩擦力等數值。
- Body 可和 ( 多個 ) Shape 綁在一起,例如搞成個啞鈴,這樣它就又有物理狀態又能碰撞了,可以和其它物體們互動啦~
- 一組一組地綁好之後用 b2World.CreateBody(b2BodyDef) 塞進世界中。這個函式用來簡化記憶體管理:讓 b2World 接手物體,在它該升仙的時候能自動拖子孫十八代下水。Python 自己有垃圾車到處開,不過對於沒有 Garbage Collector 的 C++ 框架來說,記憶體管理需要額外關注......
- 每次呼叫 b2World.Step(timeStep, velocityIterations, positionIterations) 時讓整個世界往前模擬一小步。後兩個玩意兒影響模擬精度,官方建議一般場合直接塞 10 和 8。
- 要具體呈現的話,就是在每次呼叫 Step(timeStep, 10, 8) 後讓繪圖函式重抓物件數值,更新畫面位置囉......。QGraphicsItem 之類東東的 API 還請自行查閱 Qt 文檔 =3=a
- Box2D 2.1 引進了 fixture 這玩意兒。Python binding 目前還沒更新,所以我不太瞭解是啥回事...... 貌似讓 Shape 單獨管理碰撞範圍了吧。
就這樣,更多的範例程式可以看 PyBox2D 的 testbed。
Makefile 什麼的最討厭了 (>ω<)♪♪
good job! 不知道可以在pygame里面弄 ?
回覆刪除噢 當然是可以的,能繪圖的函式庫就行
回覆刪除testbed 的入口 demos.py 裡面就有用到 PyGame