美文网首页从0开始的视觉学习
[7].了解下Opengl的矩阵变换吧

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

作者: NealDN | 来源:发表于2020-07-16 22:04 被阅读0次

跳去目录


变换

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


向量

​ 向量是由一个方向大小所构成的,是一个矢量(有方向)单位,所以在计算的时候,单纯的相加是没有意义的(比如,向上走了10步,再向右走10步,距离起点的距离并不是20步),需要使用特定的方式来处理向量的运算。在数学中,会在字母上加上一个横线(或箭头)来表示向量 \vec{v}

向量相加

向量相加并不是单纯的对向量对大小进行相加,还要考虑到向量的方向。
\vec{v} = \begin{pmatrix} 1 \\ 2 \\ 3 \\ \end{pmatrix} , \vec{j} = \begin{pmatrix} 4 \\ 5 \\ 6 \\ \end{pmatrix} , \vec{k} = \vec{v} + \vec{j} = \begin{pmatrix} 1 + 4 \\ 2 + 5 \\ 3 + 6 \\ \end{pmatrix} = \begin{pmatrix} 5 \\ 7 \\ 9 \\ \end{pmatrix}
\vec{v} = \begin{pmatrix} 4 \\ 5 \\ 6 \\ \end{pmatrix} , \vec{j} = \begin{pmatrix} 1 \\ 2 \\ 3 \\ \end{pmatrix} , \vec{k} = \vec{v} - \vec{j} = \begin{pmatrix} 4 - 1 \\ 5 - 2 \\ 6 - 3 \\ \end{pmatrix} = \begin{pmatrix} 3 \\ 3 \\ 3 \\ \end{pmatrix}

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

向量相乘

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

点乘
在计算时,点乘的结果为两个向量的大小乘以它们夹角之间的余弦值
\vec{v} · \vec{j} = ||\vec{v}| · |\vec{j}|| · \cos θ
点乘的结果是个标量(相对于向量而言,没有方向)

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


矩阵

矩阵就是一个矩形的数字、符号或表达式数组。
\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix}
上面的这个表达式就是一个2×3矩阵

矩阵相加

矩阵的相加需要对矩阵的每一个位置进行加减,最终得到一个新的矩阵
\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} + \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} = \begin{bmatrix} 1 + 1 & 2 + 2 & 3 + 3 \\ 4 + 4 & 5 + 5 & 6 + 6 \\ \end{bmatrix} = \begin{bmatrix} 2 & 4 & 6 \\ 8 & 10 & 12 \\ \end{bmatrix}

矩阵相减

矩阵的减法同它的加法
\begin{bmatrix} 3 & 2 & 1 \\ 6 & 5 & 4 \\ \end{bmatrix} - \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} = \begin{bmatrix} 3-1 & 2 - 2 & 1-3 \\ 6 - 4 & 5 - 5 & 4 6 6 \\ \end{bmatrix} = \begin{bmatrix} 2 & 0 & -2 \\ 2 & 0 & -2 \\ \end{bmatrix}

矩阵乘法

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

\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ \end{bmatrix} · \begin{bmatrix} 5 & 6 \\ 7 & 8 \\ \end{bmatrix} = \begin{bmatrix} 1*5 + 2*7 & 1*6+2*8 \\ 3*5+4*7 & 3*6+4*8 \\ \end{bmatrix} = \begin{bmatrix} 19 & 22 \\ 43 & 50 \\ \end{bmatrix}

矩阵点乘

矩阵和向量

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

矩阵乘以向量

一个4·4的矩阵乘以4·1的向量, 最终得到了4·1的向量,矩阵乘以向量的规则正是 [m·n] · \vec{n}= \vec{m} ,这是必须遵守的规则,否则OpenGL将会数据错乱。

缩放

缩放

位移

位移

旋转

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

旋转
旋转为, 如果将x,y坐标的变化及旋转的方向(OpenGL以逆时针为负)加上,则应表示为 ,拓展到矩阵则为
绕轴旋转

万向节死锁(Gimbal Lock)

万向节死锁(Gimbal Lock)

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


OpenGL中的变换

OpenGL对图形做变换时,最终是要得到每一个顶点变换后的向量,因此,需要将原顶点放在最后进行计算,也即是

矩阵变换
依照上面的方式,将每个顶点都进行矩阵变换,这样,就能得到变换后的顶点信息了,也就能得到变换后的图像数据了

跳去目录

相关文章

  • [7].了解下Opengl的矩阵变换吧

    跳去目录 变换 ​ 在OpenGL中,所有的变换都是由缩放 平移 旋转 这三种基本的变换方式得到的,实际上,是...

  • OpenGL--向量和矩阵

    在我们OpenGL中涉及到图形变换的时候经常会运用到向量/矩阵的运算。今天我们就来了解下OpenGL中的向量、矩阵...

  • 音视频开发之旅(11) OpenGL ES矩阵变换与坐标系统

    目录 矩阵与矩阵变换 坐标系统 OpenGL的矩阵与矩阵变换 实践:平移、旋转、缩放、3D 资料 收获 一、矩阵与...

  • OpenGL 矩阵变换

    视图变换 视图变换是指定观察者的位置,是应用到场景中的第一种变换,它用来确定场景中的有利位置。 在默认情况下,透视...

  • OpenGL-矩阵压栈出栈浅析

    OpenGL绘制图形需要经过变化才能达到用户目的,而变换是通过矩阵进行操作的。 OpenGL一般通过视图变换、模型...

  • OpenGL(3) —— OpenGL 的矩阵变换

    基本计算 向量之间的计算有 点积、叉积。矩阵之间的计算有加减、数乘、矩阵间乘法。 矩阵的缩放 位移 旋转 一个向量...

  • OpenGL(五)-矩阵变换

    关键函数讲解 平移 旋转 缩放 案例1 : 利用矩阵的平移、旋转、综合变化等, 实现矩阵的移动. 效果图: 注: ...

  • OpenGL 向量 矩阵 变换

    向量 单位向量 标量:只有大小,例如:1,2,3...向量:既有大小又有方向。单位向量:向量长度(向量的模)为1的...

  • OpenGL(五)-- OpenGL中矩阵的变换

    OpenGL(五)-- OpenGL中矩阵的变换 前言 照常提出几个问题,希望通过阅读可以找到答案。 对物体3维的...

  • 3D变换:模型,视图,投影与Viewport

    OpenGL 使用列主序矩阵,即列矩阵,因此我们总是倒过来算的(左乘矩阵,变换效果是按从右向左的顺序进行): 投影...

网友评论

    本文标题:[7].了解下Opengl的矩阵变换吧

    本文链接:https://www.haomeiwen.com/subject/tmxvhktx.html