還記得兩年前校招面試被問到了這個並不復雜的問題,那時候我居然傻傻地沒有推倒出來,現在想想真是菜的扣腳!!
這么基礎的知識還是要完全搞清楚,於是我決定找個時間專門把常用的三維變換矩陣的推導總結一番
1.二維的旋轉
假設平面上存在一點(用極坐標表示)(ρ,θ),那么他在直角坐標中可以表示為x = ρ * cosθ, y = ρ * sinθ。
現在把這個點逆時針旋轉α度,其極坐標為(ρ, θ + α),直角坐標為x’ = ρ * cos(θ + α), y’ = ρ * sinθ (θ + α)
展開可推得x’ = x * (cosα - sinα) , y’ = y * (sinα + cosα)
2.有了二維的基礎,我們就可以表示三維里繞坐標軸的旋轉了
比如繞Z軸的旋轉:
3.然而表示了旋轉並沒有大功告成,我們還需要平移、縮放
兩個向量相加等於每個元素相加:(x1, y1, z1) + (x2, y2, z2) = (x1 + x2, y1+ y2, z1+z2)
顯然3 * 3的矩陣式無法表示的,於是我們再增加一維,表示如下:
游戲引擎層的矩陣大部分都是采用4 * 4矩陣,於是我們統一把旋轉也用4維表示
繞X軸旋轉:
繞Y軸旋轉:
繞Z軸旋轉:
有了這幾個基本的元素,我們已經可以表示任何旋轉啦,比如先向X軸轉一下,再向Y軸轉一下,兩個矩陣相乘就得到了一個不是繞坐標軸的旋轉矩陣
4.縮放
這個就更簡單啦,假設x軸的縮放因子為sx, y軸的縮放因子為sy,z軸的縮放因子為sz,那么縮放矩陣可表示為:
至此,最基本的變換矩陣都推倒完畢了,剩下的只要把他們相互組合,就可以使用矩陣表示一個點的變換了。