[7].了解下Opengl的矩阵变换吧
变换
在OpenGL中,所有的变换都是由缩放
平移
旋转
这三种基本的变换方式得到的,实际上,是对片段
的顶点
所进行的操作,在图形简单,顶点很少的情况下,对每个顶点
进行操作是可行的,但涉及到大量的顶点数据时,这种操作就显得笨拙且效率低下,所以引入矩阵
与向量
这两个数学概念(数学果然不愧是工具),一次性的操作所有的顶点,这样不仅高效,而且优雅(手动狗头).
向量
向量是由一个方向
和大小
所构成的,是一个矢量(有方向)
单位,所以在计算的时候,单纯的相加是没有意义的(比如,向上走了10步,再向右走10步,距离起点的距离并不是20步),需要使用特定的方式来处理向量的运算。在数学中,会在字母上加上一个横线(或箭头)来表示向量
向量相加
向量相加
并不是单纯的对向量
对大小进行相加,还要考虑到向量
的方向。
最后得到的结果分别是从原点(0,0,0)指向(5,7,9)的向量和从原点(0,0,0)指向(3,3,3)的向量.
向量相乘
两个向量相乘是一种很奇怪的情况。普通的乘法在向量上是没有定义的,因为它在视觉上是没有意义的。但是在相乘的时候我们有两种特定情况可以选择:一个是点乘(Dot Product)
,记作⋅,另一个是叉乘(Cross Product)
,记作x。
点乘
在计算时,点乘
的结果为两个向量的大小
乘以它们夹角
之间的余弦值
点乘
的结果是个标量(相对于向量而言,没有方向)
叉乘
叉乘
只在3D空间中有定义,它需要两个不平行向量
作为输入,生成一个正交
于两个输入向量的第三个向量。如果输入的两个向量也是正交
的,那么叉乘
之后将会产生3个互相正交
的向量。
矩阵
矩阵
就是一个矩形的数字、符号或表达式数组。
上面的这个表达式就是一个2×3矩阵
矩阵相加
矩阵的相加需要对矩阵的每一个位置进行加减,最终得到一个新的矩阵
矩阵相减
矩阵的减法同它的加法
矩阵乘法
在矩阵
中,一般是以点乘
的形式对矩阵进行乘法运算
矩阵和向量
在OpenGL中,我们通常使用4×4的变换矩阵,前三个值分别代表(x,y,z),最后一个值代表缩放因子
,矩阵
与向量
相乘
将得到一个向量
一个4·4
的矩阵乘以4·1
的向量, 最终得到了4·1
的向量,矩阵
乘以向量
的规则正是 [m·n] · ,这是必须遵守的规则,否则OpenGL将会数据错乱。
缩放
缩放
位移
位移
旋转
旋转
会麻烦一些,涉及到三角变换
,切根据旋转的轴的不同,其计算的方式也有所不同,以绕Z轴顺时针旋转60°为例(也就是360/6=60),
旋转为, 如果将x,y坐标的变化及旋转的方向(OpenGL以逆时针为负)加上,则应表示为 ,拓展到矩阵则为
绕轴旋转
万向节死锁(Gimbal Lock)
在上述的矩阵变化中,会产生一个新的问题(详见上述视频地址),所产生的结果是片段会以一个奇怪的不符合我们希望的轨迹旋到最终的位置,为了解决这个问题,大佬们设计了一个超级复杂的计算公式,但也不能完全解决万向节死锁问题,而OpenGL中则是使用了四元数
来进行解决(四元数-百度百科),在此不深究。
OpenGL中的变换
OpenGL对图形做变换时,最终是要得到每一个顶点变换后的向量,因此,需要将原顶点放在最后进行计算,也即是
依照上面的方式,将每个顶点都进行矩阵变换,这样,就能得到变换后的顶点信息了,也就能得到变换后的图像数据了