Vector reflection 向量鏡射 基本的碰撞反彈回饋

這篇文應該是要跟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

3D Programming Reflecting a Vector

How to get reflection vector?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *