制作簡單的2D物理引擎(一)——動力學基礎


一切的基礎

在二維平面中,點$P$就是坐標$(x,y)$,點集就是一系列坐標的集合$\{P_1,P_2,...,P_n\}$,不過這個集合是有序的(順時針)。

向量

加減運算

$$\vec{P}\pm\vec{Q}=(P_x\pm Q_x,P_y\pm Q_y)$$

$$\vert\vec{P}\vert=\sqrt{P_x^2+P_y^2}$$

單位向量

$$\vec{e}=\frac{\vec{P}}{\vert\vec{P}\vert}$$

角度

$$\alpha=arctan(\frac{y}{x})$$

旋轉

$$
\left[\begin{array}{c}
x'\\
y'
\end{array}\right]=\left[\begin{array}{cc}
cos(\alpha) & -sin(\alpha)\\
sin(\alpha) & cos(\alpha)
\end{array}\right]\left[\begin{array}{c}
x\\
y
\end{array}\right]
$$

點積

主要用來判斷角度關系。

$$\vec{P}\cdot\vec{Q}=(P_{x}+Q_{x},P_{y}+Q_{y})$$

叉積

主要用來求面積。

$$
\vec{P}\times\vec{Q}=\left|\begin{array}{ccc}
\boldsymbol{\vec{i}} & \boldsymbol{\vec{j}} & \vec{\boldsymbol{k}}\\
P_{x} & P_{y} & P_{z}\\
Q_{x} & Q_{y} & Q_{z}
\end{array}\right|
$$

物體的表示

我們只實現一類物體——凸幾何體。

幾何屬性

頂點集

凸幾何體固有的幾何外形——$N$個頂點,所以只需要儲存這些頂點即可。

有人問:物體運動后,位置改變了怎么辦?一般而言,要對原始頂點集做矩陣變換,才能得到最終位置。

軸向量

另外,為了便於計算,還需要儲存一些向量——幾何體每條邊的單位向量。

面積

由已知的頂點集可以確定一個幾何體,那如何求其面積?

假設由原點$O$和任意兩個相鄰頂點$P$、$Q$組成三角形,那么這些所有三角形加起來就是幾何形的面積。

現在就是求$\triangle OPQ$的面積了。由叉乘的定義,兩向量叉乘的結果的模就是其相應平行四邊形的面積。

故有$2S=(Q_x-P_x)\times(Q_y+P_y)$。

重心

在這里,物體的密度$\rho$是均勻的。

設頂點數為$n$,頂點$P_1\sim P_n$,故

$$\vec{P_G}=\frac{1}{n}\sum_{i=1}^{n}\vec{P_i}$$

物理屬性

質量、速度、位置、受力、密度、角偏、角加速度、扭矩、摩擦系數等。

外觀屬性

美觀起見,給物體添加顏色。

物體的運動

力學令人着迷,用計算機來模擬力學就不那么容易了,萬事開頭難,做仿真還是要從理論學起。

力學無非就是加速度、碰撞、摩擦等內容。不過對物體(剛體)來說,它的運動不是平動就是轉動。

平動

平動部分是較為簡單的,最經典的公式:

  • 力$F=ma$
  • 速度$v=at$
  • 位移$s=vt$

無須多言。

轉動

剛體的轉動可能令人感覺陌生,其實類比平動,大致相同。

平動中,力$F$產生加速度$a$,進而影響速度$v$,進而影響位移$s$。

轉動中,力矩$M$產生角加速度$\alpha$,進而影響角速度$\omega$,進而影響角位移$\theta$。

力矩$M=r\times F$,$r$是力臂,$F$是外力。

但是,力矩$M$產生角加速度$\alpha$,公式是$M=J\alpha$,這里就比平動復雜了。$J$是轉動慣量,也能用$I$表示,類比於質量$m$。

轉動慣量

求幾何體$\{P_1,P_2…P_n\}$的轉動慣量。

根據公式:

$$I=\frac{{m}}{6}\frac{\sum_{i=1}^{n}\left\Vert \vec{P_{i+1}}\times\vec{P_{i}}\right\Vert (\vec{P_{i+1}^2}+\vec{P_{i+1}}\cdot \vec{P_{i}}+\vec{P_i^2})}{\sum_{i=1}^{n}\left\Vert \vec{P_{i+1}}\times\vec{P_{i}}\right\Vert }$$

力的交互

重力

物體在重力場中受到一個恆定方向、恆定大小的力$g$,將它算入總受力。

碰撞

兩個物體間產生碰撞,這是物理引擎最核心的部分之一。

一般來說,要解決這幾個問題:

  1. 如何檢測到碰撞的產生?
  2. 如何確定碰撞點及方向?
  3. 如何做精度修正?
  4. 如何解決“子彈”問題?

解決了上述幾個問題后,我們就可以求得發生碰撞的兩個物體的總受力和力矩和,從而解析它們將要產生的平動和轉動。

涉及碰撞的內容很多,在后面會講到。

摩擦

物體受空氣阻力和地面摩擦力影響。地面摩擦力對物體產生的影響算入力矩和。

總結

實際上,一個涉及力學的物理引擎要做的最主要的事就是:

求物體所受力和力矩,從而計算它將要發生的平動和轉動。

但如何求得力和力矩?這便是一個很復雜的問題了。像重力可以直接影響物體所受力,摩擦可以直接影響物體所受力矩,這些都很簡單。較為復雜的就是兩個物體間的碰撞了,在這里,物體引擎有一半以上的代碼是用來計算碰撞的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM