变换

  1. OpenGL中,所有的变换都是由`缩放` `平移` `旋转` 这三种基本的变换方式得到的,实际上,是对`片段``顶点`所进行的操作,在图形简单,顶点很少的情况下,对每个`顶点`进行操作是可行的,但涉及到大量的顶点数据时,这种操作就显得笨拙且效率低下,所以引入`矩阵``向量` 这两个数学概念(数学果然不愧是工具),一次性的操作所有的顶点,这样不仅高效,而且优雅(手动狗头).

向量

  1. 向量是由一个`方向``大小`所构成的,是一个`矢量(有方向)`单位,所以在计算的时候,单纯的相加是没有意义的(比如,向上走了10步,再向右走10步,距离起点的距离并不是20步),需要使用特定的方式来处理向量的运算。在数学中,会在字母上加上一个横线(或箭头)来表示向量 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1722063/1594918031117-c9b6faa7-cb65-4544-9c30-b137601c0426.png#align=left&display=inline&height=23&margin=%5Bobject%20Object%5D&name=image.png&originHeight=46&originWidth=36&size=993&status=done&style=none&width=18)

向量相加

  1. `向量相加`并不是单纯的对`向量`对大小进行相加,还要考虑到`向量`的方向。<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1722063/1594917885788-177f98de-4ba5-4761-b061-fb3088bf0e26.png#align=left&display=inline&height=170&margin=%5Bobject%20Object%5D&name=image.png&originHeight=340&originWidth=1008&size=61071&status=done&style=none&width=504)

最后得到的结果分别是从原点(0,0,0)指向(5,7,9)的向量和从原点(0,0,0)指向(3,3,3)的向量.

向量相乘

两个向量相乘是一种很奇怪的情况。普通的乘法在向量上是没有定义的,因为它在视觉上是没有意义的。但是在相乘的时候我们有两种特定情况可以选择:一个是点乘(Dot Product),记作image.png,另一个是叉乘(Cross Product),记作image.png

点乘
在计算时,点乘的结果为两个向量的大小乘以它们夹角之间的余弦值
image.png
点乘的结果是个标量(相对于向量而言,没有方向)

叉乘
叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。如果输入的两个向量也是正交的,那么叉乘之后将会产生3个互相正交的向量。


矩阵

矩阵就是一个矩形的数字、符号或表达式数组。
image.png
上面的这个表达式就是一个2×3矩阵

矩阵相加

矩阵的相加需要对矩阵的每一个位置进行加减,最终得到一个新的矩阵
image.png

矩阵相减

矩阵的减法同它的加法
image.png

矩阵乘法

矩阵中,一般是以点乘的形式对矩阵进行乘法运算
image.png
image.pngimage.png


矩阵和向量

在OpenGL中,我们通常使用4×4的变换矩阵,前三个值分别代表(x,y,z),最后一个值代表缩放因子,矩阵向量 相乘将得到一个向量

[7].了解下Opengl的矩阵变换吧 - 图10
一个4·4的矩阵乘以4·1的向量, 最终得到了4·1的向量,矩阵乘以向量的规则正是 image.png ,这是必须遵守的规则,否则OpenGL将会数据错乱。

缩放

[7].了解下Opengl的矩阵变换吧 - 图12

位移

[7].了解下Opengl的矩阵变换吧 - 图13

旋转

旋转会麻烦一些,涉及到三角变换,切根据旋转的轴的不同,其计算的方式也有所不同,以绕Z轴顺时针旋转60°为例(也就是360/6=60),

[7].了解下Opengl的矩阵变换吧 - 图14
image.png旋转为image.png, 如果将x,y坐标的变化及旋转的方向(OpenGL以逆时针为负)加上,则应表示为image.png ,拓展到矩阵则为
[7].了解下Opengl的矩阵变换吧 - 图18

万向节死锁(Gimbal Lock)

万向节死锁(Gimbal Lock)

在上述的矩阵变化中,会产生一个新的问题(详见上述视频地址),所产生的结果是片段会以一个奇怪的不符合我们希望的轨迹旋到最终的位置,为了解决这个问题,大佬们设计了一个超级复杂的计算公式,但也不能完全解决万向节死锁问题,而OpenGL中则是使用了四元数来进行解决(四元数-百度百科),在此不深究。


OpenGL中的变换

OpenGL对图形做变换时,最终是要得到每一个顶点变换后的向量,因此,需要将原顶点放在最后进行计算,也即是
[7].了解下Opengl的矩阵变换吧 - 图19image.png
依照上面的方式,将每个顶点都进行矩阵变换,这样,就能得到变换后的顶点信息了,也就能得到变换后的图像数据了