2011年1月4日

PyQt + PyBox2D is easy!

Qt Labs 的文章 Qt + Box2D is easy! 給了一個物體碰撞的小範例。

Box2D 是一個開源的 C++ 2D 剛體物理引擎,包括了連續碰撞偵測、支點限制、摩擦力、齒輪等功能,可以模擬物體互動...... 的數值。它的核心本身不管畫面渲染,所以只會更新物體們的狀態;欲呈現出來,請自行調用任意繪圖函式庫,抓物件狀態數值出來畫......

所以那篇文章就用 Qt 繪圖框架結合 Box2D,弄了個漂亮的彩色小三角形下落模擬。由於我個人一看到 C++ 語法就開始覺得陣陣髮指兼蛋疼,所以把原文給的程式碼用 Python 改寫了。結果在這裡 ( 備份 )。

測試通過的環境:
ArchLinux
Python2.7.1
Box2D2.1.2
PyBox2Dsvn
PyQt4.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 什麼的最討厭了 (>ω<)♪♪

2 則留言:

  1. good job! 不知道可以在pygame里面弄 ?

    回覆刪除
  2. 噢 當然是可以的,能繪圖的函式庫就行

    testbed 的入口 demos.py 裡面就有用到 PyGame

    回覆刪除