三维空间中有时候需要计算绕任意点旋转的矩阵,假设绕点P(x1,y1)旋转α角度,则步骤分为三步:
1.计算将P点平移到原点的矩阵T1。
2.计算旋转α角度的旋转矩阵R1。
3.计算将从原点平移到P点的平移矩阵T2。
最终的结果矩阵matrix = T1 * R1 * T2,旋转后的顶点坐标P' = matrix * P。
代码如下:
1 vec4 getRoateByPoint(vec3 point,vec3 roatePoint,float angleZ)
2 {
3
4 //=================得到变换矩阵 start====================
5 //平移到原点的平移矩阵
6 mat4 firstransfromMat = mat4(1.0, 0.0, 0.0, -roatePoint.x,
7 0.0, 1.0, 0.0, -roatePoint.y,
8 0.0, 0.0, 1.0, -roatePoint.z,
9 0.0, 0.0, 0.0, 1.0);
10 0.0, 0.0, 0.0, 1.0);
11
12
13 mat4 RoateMatZ = mat4(cos(angleZ), -sin(angleZ), 0.0, 0.0,
14 sin(angleZ), cos(angleZ), 0.0, 0.0,
15 0.0, 0.0, 1.0, 0.0,
16 0.0, 0.0, 0.0, 1.0);
17
18 //平移到目标点的平移矩阵
19 mat4 lasttransformat = mat4(1.0, 0.0, 0.0, roatePoint.x,
20 0.0, 1.0, 0.0, roatePoint.y,
21 0.0, 0.0, 1.0, roatePoint.z,
22 0.0, 0.0, 0.0, 1.0);
23 //=================得到变换矩阵 end====================
24 return firstransfromMat * RoateMatZ * lasttransformat * vec4(point,1.0);//
25 }