這篇文應該是要跟MTV(Minimum Translation Vector)的碰撞回饋一起寫,然後放成品當範例,但MTV有個Polygon to circle部分沒有寫很好,所以先記錄Vector Reflection。
為什麼需要取得鏡射向量(Vector reflection)
一個簡單的例子,當乒乓球擊中球拍時,要如何取得反彈後的向量,而光影模擬時也會需要取得光線反射的向量。
圖片引用自Tricks of the Windows® Game Programming Gurus, Second Edition
如何取得Vector reflection
先定義一些資訊:
V1 = 物體的速度
V2 = 物體反彈後的速度
N = 擊中平面的法向量
如何取得法向量 N ?
透過兩垂直向量點積為0的特性就可以得到,假設Axis是(3, 4)的向量,那平面法向量就會是(-4, 3) 或是(4, -3)
再來看如何取得 V2
將V1與V2之間畫一條線,並組合成一個平行四邊形,這樣就很明顯得到 \(V_2 = 2N’ + V_1\),那麼接下來的問題就會是如何取得\(N’\)。
如何取得N’
先只單看V1跟法向量N,可以發現N’ 其實就是V1在法向量N上面的投影,所以可以透過基本三角函數來取得 (要注意V1跟N反向,所以求出的值要加負號)。
但\(Cos(\theta)\)需要另外計算夾角,所以有個更好的方法來代替,在點積公式中,使其中一個向量為單位向量,因為長度為1可直接省略,所以\(|\vec{V_1}| Cos(\theta) = \vec{V_1} \cdot \hat{n}\) :
再來回到 V2 = 2N’ + V1
該有的東西都有了,所以整理後可以得到:
\(V_2 = V_1 – 2(V_1 \cdot \hat{n})\hat{n}\)
\(V_1\) = 物體速度
\(\hat{n}\) = 擊中平面的單位法向量
\(V_2\) = 反彈後的速度
接者就可以用在當物體跟某個平面碰撞後,更新反彈後的速率為V2,就會有乒乓球反彈的效果了,範例的話等之後有空再放。
大概就這樣,結果這篇文思考如何畫圖解釋比較麻煩
參考資料
![]() |
Basic Ad Hoc Collision Response |
留言