3D图形学学习——旋转矩阵以及Unity的应用

矩阵旋转公式:

  绕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采用的是左乘。

猜你喜欢

转载自www.cnblogs.com/leixuan111/p/12347710.html
今日推荐