最近發現了Github上的開源物理引擎項目Matter.js,對它很感興趣,發現源碼並不算長,算上注釋大約1萬行左右,值得剖析一番。Matter.js實現一個最小化的2D物理引擎,性能不錯,故打算用C#重寫並學習之。
由於JS是弱類型,而C#是強類型的,所以不得不還原相應的類型。在重寫過程中,我也發現了源碼中的一些問題,以及代碼冗余,不過都無關緊要。在一萬行之內實現一個簡單的物理引擎本來就很令人激動了,這樣可以以最小的工作量來熟悉物理引擎。
重寫過程中,渲染用自帶GDI實現,所以只需考慮物理引擎中的代碼邏輯即可。因需要最簡化代碼,故有些內容如Sleep等就略過了,只考慮核心部分,即力的仿真和碰撞檢測。
最終,我們的物理引擎有下列幾個部分:
- 幾何體樹
- 物理學意義上的基本對象(如點、點集、邊界等)
- 簡單的碰撞檢測(寬、窄)
- 位置修正
- 速度修正
代碼在Github上:https://github.com/bajdcc/PhysicsEngine
不過,在這之前,需要好好復習一下牛頓力學,包括平動和轉動。
本章為目錄,將不斷更新。