三维变换矩阵推导笔记

  还记得两年前校招面试被问到了这个并不复杂的问题,那时候我居然傻傻地没有推倒出来,现在想想真是菜的扣脚!!

  这么基础的知识还是要完全搞清楚,于是我决定找个时间专门把常用的三维变换矩阵的推导总结一番

  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,那么缩放矩阵可表示为:

  

  至此,最基本的变换矩阵都推倒完毕了,剩下的只要把他们相互组合,就可以使用矩阵表示一个点的变换了。  

原文地址:https://www.cnblogs.com/SolarWings/p/6243577.html