自己動手寫2D物理引擎 初級篇 1

2021-10-10 20:33:37 字數 1786 閱讀 5924

第一章 框架設計

總體的類如下圖所表示。

shape作為形狀基類。儲存了與形狀有關的物理量

class

shape

;

rectangle和circle派生於shape,儲存了實際的形狀資訊。

class

rectangle

:public shape

;class

circle

:public shape

;

phyattr中存放的是各種物理屬性,這些屬性是不限於任何物體都有的屬性。

namespace phy2d

agl::vec2f velocity;

//速度

agl::vec2f position;

//位置

float rotation =

0.0f

;//旋轉角度

float angularvelocity =

0.0f

;//角速度

agl::vec2f force;

//力float torque =

0.0f

;//轉矩

float friction =

0.0f

;//摩擦力

float mass =

0.0f

, invmass =

0.0f

;//質量和逆

~phyattr()

};};

phyobj是phyrect與phycircle的父類,其主要作用是做為基類指標,支援動態型別使用,分別繼承了形狀和物理特性,組成了有物理特性的形狀。

namespace phy2d

;class

phyrect

:public phyobj,

public rectangle,

public phyattr ;

class

phycircle

:public phyobj,

public circle,

public phyattr ;

};

world中負責整個物理世界的執行,儲存物體和碰撞資訊。協調整個物理引擎的流程。

namespace phy2d

;}

contact是儲存碰撞資訊的結構體,impulse是儲存衝量的,因為我們要實現衝量累積方法,所以碰撞資訊中保留上一次的衝量資訊。driver是儲存兩個物體指標和其碰撞資訊的結構體,這個結構是存放碰撞後結果的直接結構體,並且其中要有計算兩個物體衝量變化的能力。

namespace phy2d

;//碰撞資訊

class

contact

agl::vec2f position;

//碰撞點位置

agl::vec2f normal;

//分離軸方向

//agl::vec2f r1, r2;//半徑//現場算

float separation;

//最小相交距離};

class

driver};

}

還有一些數學計算,向量計算的類,這些類可以自己寫,也可以用現成的比如glm,這裡就使用自己寫的向量矩陣計算庫了。

自己動手寫搜尋引擎

radic 是我用go語言實現搜尋引擎的索引部分,包括 倒排索引 正排索引 分布式索引 首先需要go get github.com orisun radic package main import radic types bytes encoding gob fmt radic time book ...

關於2d物理引擎box2d與ape的評論

ape不行,做點簡單的撞球,撞球之類遊戲還行。我最開始用他實驗性做了個簡單的基於物理引擎的泡泡龍類遊戲,發現稍微多一點的幾何體堆疊在一起就會產生滲透現象,沒辦法只好更改最初的設計。要專注做物理遊戲,還是要精通box2d才行,而且box2d幾乎任何主流語言都有它的版本。所以建議不要學ape,除非你只是...

自己動手寫docker 2

2.1 linux namespace linux 支援的namespace namespace api的基本系統呼叫 不完整的ex,以下為呼叫後截圖為 package main import log os os exec syscall func main syscall.credential c...