矩陣旋轉公式:
繞z軸旋轉:
Rz(θ) = cosθ , sinθ , 0
- sinθ , cosθ , 0
0 , 0 , 1
推導過程:
AB線段旋轉θ度變幻到A‘B‘
根據sinθ = 對邊/斜邊
cosθ = 鄰邊/斜邊
且由上圖可知:
A'坐標
|x| =1 * cosθ
|y| = 1 * sinθ
由因為處於第一象限
所以xy的唯一值為 (cosθ,sinθ);
A' = (cosθ,sinθ,0);
B'坐標
|x| = 1 * sinθ
|y| = 1 * cosθ
因為處於第三象限
所以xy的唯一值為 - sinθ , cosθ
B' = (- sinθ , cosθ , 0)
因為是繞Z軸旋轉,所以物體Z軸不變。
可得矩陣
Rz(θ) = cosθ , sinθ , 0
- sinθ , cosθ , 0
0 , 0 , 1
注:這里一定要弄清楚Unity的左手坐標系,左手坐標系的Z軸正方向旋轉為逆時針。
判斷旋轉方向的方式:左手豎起大拇指,握拳方向即為正旋轉方向。大拇指的指向與3D坐標系3根手指的指向保持一樣。繞不同的軸,大拇指指向不同的方向,此時的握拳4根手指的方向就是Unity里面的正方向。
矩陣公式推導出來后,可以去Unity里面寫個shader驗證一下。
///某個點繞Z軸旋轉 float3 rotAroundZ(float angle , float3 pos) { float3x3 rotMatrix = { float3(cos(angle),sin(angle),0), float3(-sin(angle),cos(angle),0), float3(0,0,0) }; return mul(pos,rotMatrix); }
angle會隨着時間參數的增大而增大,從而實現旋轉的功能,如果需要反轉方向,rotMatrix和pos 參數位置互換即可。Unity采用的是左乘。