前往
大廳
主題

【程式設計練習】C++ SFML 模擬引力與2維完全彈性碰撞

需要冷氣支援 | 2022-03-31 19:32:54 | 巴幣 1212 | 人氣 415

又是久違的更新,首先恭喜狼與辛香料新一季製作決定 WOWOWOWOWOWOW
今天分享一下YT上看到後想試試看的東西
用C++ SFML 模擬引力與2維完全彈性碰撞,這邊主要紀錄物理實作部分
首先用class建出星體的基本結構包含:
1.質量
2.半徑
3.SFML中要繪製的圓形物件
4.位置
5.速度
6.加速度
然後寫好建構子這樣想要加多個星體比較方便
第一部分 引力
這部分比較簡單因為只有兩條公式,假設目前算的是星體1即s1
s1受到的力為F = G*m1*m2 / r^2
而s1的加速度為 F = m1*a => a = F/m1
因為最後影響的只有s1的加速度,所以不用在意先後做運算會影響到其他星體的情況
第二部分 2維完全彈力碰撞
這個部分就需要用到向量的運算了,首先不考慮碰撞後摩擦力的問題
假設兩星體質心的連線為x軸,垂直方向為y軸,則x軸方向做一維碰撞,y軸方向動量不變
根據動量守恆 m1*v1 = m2*v2
與動能守恆 (1/2)*m1*v1^2 + (1/2)*m2*v2^2 = (1/2)*m1*v1'^2 + (1/2)*m2*v2'^2
可以解出s1碰撞後的速度 v1' = ( v1*(m1 - m2) + 2*m2*v2 ) / (m1 + m2) ...... (式1)
我的作法是先從所有星體中選第一顆與其他顆檢查有無碰撞依序檢查所以星體,因此算v1即可
接下來因為是2維彈性碰撞因此有分力的問題要解決
假設s1(右下)以v1速度撞向s2(左上),s2以v2速度撞向s1
首先將v1分成 與s1和s2質心連線平行的力v1垂直(向量) 與s1和s2切線方向平行的力v1平行(向量)
之後因為v1平行切面因此不受s2影響,v1垂直v2垂直做完全彈性碰撞(式1),之後v1平行+v1垂直
就會等於碰撞後的新v1'

作法是先將算出圓心差距後轉為v1垂直的單位向量,再使用選轉矩陣旋轉90度得到v1平行的單位向量
選轉矩陣轉90度其實就是 (x,y) -> (-y,x)
將兩方向的單位向量與v1做內積(也就是投影在兩單位矩陣上),就能得到v1垂直v1平行
用同樣方法算出v2垂直v1垂直做完全彈性碰撞得到v1垂直方向的純量 v1',再乘上v1垂直的單位向量
得到v1'垂直最後與v1平行相加後就是s1新的速度v1',最後記得因為會改變s1速度所以要等所有星體都計算完畢後才能更改s1的速度。
大致上就是這樣
結果影片:
這也不是學校功課之類ㄉ就是做爽的 GIT

創作回應

更多創作