矩阵旋转公式:
绕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采用的是左乘。