做商业地产的网站,电子商务网站建设理解,wordpress全站模板,网站的广度OpenGL ES 的很多教程里都会有这样一个例子来讲解纹理#xff1a;将一张图片作为纹理显示在屏幕上。因为纹理坐标和实际屏幕显示的坐标不一样#xff0c;把图片渲染在屏幕上后#xff0c;图片是上下颠倒的。一个解决方法是对当前的顶点坐标#xff0c;乘以绕 z 轴旋转180度… OpenGL ES 的很多教程里都会有这样一个例子来讲解纹理将一张图片作为纹理显示在屏幕上。因为纹理坐标和实际屏幕显示的坐标不一样把图片渲染在屏幕上后图片是上下颠倒的。一个解决方法是对当前的顶点坐标乘以绕 z 轴旋转180度的矩阵这样图片就能正确显示了。那么如何理解这个旋转矩阵呢影响我们理解这个矩阵的第一个问题是为什么这个矩阵是 4x4 的 而且我们发现旋转缩放、平移等变换矩阵都是 4x4 的。在直观上的认知里表达一个三维空间的坐标用 x,y,z 就足够了那在三维空间里进行矩阵变换用 3x3 的矩阵就够了为什么需要 4x4 呢为了回答这个问题下面我们先在几何意义上理解**向量和矩阵之间的关系然后通过推导旋转矩阵**和平移矩阵一步步来解开这个疑惑。向量和矩阵在几何平面上我们可以把平面上任意一点当作与原点组成的一个 向量 来理解。如图 A 点可以表示成向量 在 x 轴和 y 轴上各有 i 点(1 0)和 j 点(01)同样的让它们与原点组成向量为了简化我们用 和 表示这两个向量。向量和矩阵因为 A 点的坐标为 (3, 2)如果我们要用 和 表示 那是这样的这里的几何意义是 延展到 延展到 然后把这两个向量相加即可得到i 坐标是 (1 0)j 坐标是 (01)我们把上面这个等式转换成竖列的形式这里其实是向量的简单运算运算过程如下看到运算过程是否有种似曾相识的感觉这不就是矩阵与向量的乘法计算吗这个运算其实就是将向量左乘一个矩阵 的计算这里 其实就是单元矩阵左乘一个单元矩阵并不会改变原来的值。而这个单元矩阵以两个竖列来看正是 i 和 j 点的坐标也是向量 和 在数学上将 和 称为此坐标系的 基向量。推导旋转矩阵我们现在把整个坐标轴绕原点逆时针旋转 推导旋转矩阵旋转后 i 点和 j 点对应 和 位置。通过简单的三角函数计算得到 坐标为 坐标为旋转后A 点的坐标是多少呢回顾上面的做法 延展到 延展到 然后把这两个向量相加即可得到 。结合上面一节矩阵和向量的推演可以变成下面的形式我们发现左边的矩阵不正是开头所看到的 旋转矩阵 吗只不过这是二维平面上的旋转矩阵:结合图形和计算我们可以这样理解这个二维矩阵二维矩阵代表一个坐标系里的两个基向量而在这个坐标系里的点与原点组成的向量都可以用这两个基向量的变换来表示。那么旋转一个点可以转换成旋转这个点所在的坐标系从而通过变化的基向量求出旋转后的点的位置。其实这种变换在数学上称作 线性变换 线性变换是通过 矩阵乘法 来实现线性变换是在两个向量空间(包括由函数构成的抽象的向量空间)之间的一种保持向量加法和标量乘法的特殊映射线性变换在几何直观上有如下特点变换前后直线仍然保持是直线的状态变换前后原点保持固定不会变化我们从二维平面推导到三维坐标也是同理只不过是多了个 z 轴竖着来看这个矩阵是 xyz轴上的三个基向量同时它又是一个单元矩阵。同理上面二维平面的推导三维坐标绕 z 轴的旋转矩阵为推导平移矩阵那么平移操作能不能也用这种矩阵与向量相乘的形式呢我们再次回到二维平面看看将 A 点平移到 B 点的情况是怎样的。要将 A 点(32)平移到 B 点(45)实际上就是先将 A 点往右移动 1 再往上移动 3即 x 坐标值增加 1y坐标值增加 3从上面的运算来看平移这种操作实际上是 向量的加法即:我们可以通过向量加法的 平行四边形法则 加深理解如下图对于平移这种操作我们无法仅仅通过矩阵乘法来实现。而实际上平移这种操作属于 仿射变换 。仿射变换又称仿射映射是指在几何中对一个向量空间进行一次线性变换并接上一个平移变换为另一个向量空间。仿射变换在几何直观上相比线性变换它不需要保证变换前后坐标原点不变。如下图从 A 点平移到 B 点我们换一个角度思考这次不移动点而是移动整个坐标轴同样可以达到平移 A 点到 B 点的需求但是坐标原点移动到了 O 点(13)。我们希望构造的是像下面这种矩阵乘法的等式这样才能用一个通用的计算模式来处理坐标点的变换。矩阵到这里我们终于要请出 齐次坐标 了。齐次坐标就是将一个原本是 n 维的向量用一个 n1 维向量来表示是指一个用于投影几何里的坐标系统如同用于欧氏几何里的笛卡儿坐标一般。用一个通俗的讲法是我们需要 升维 来处理这个问题。通过增加一个维度我们可以在高维度上通过线性变换来处理低维度的仿射变换。这句话咋一听感觉很有哲理但是通过下面的数学等式就能知道其中的奥妙观察上面的运算过程结果 不正是我们上面所得的 吗只不过多了一个 z 轴的坐标值。我们通过升级一个维度将在二维平面上的平移问题转换成了在三维坐标的矩阵和向量乘法。那么在二维平面上这个平移矩阵就为tx 和 ty 就对应在 x 轴 和 y 轴上的移动距离。同理推广到三维坐标系要实现三维坐标的平移操作同样需要通过升维引入齐次坐标来计算。那么三维坐标下的平移矩阵就为总结至此我们可以回答最开始的问题了为什么 OpenGL 里的矩阵变换是 4x4 的矩阵呢我们来想象这样一个场景如果我要让顶点坐标旋转一定角度后再平移一段距离那么这里面的操作就涉及 3x3 矩阵的计算和 4x4 矩阵的计算如果不统一起来这种连续变换的计算操作将很复杂。所以如果要用矩阵乘法来统一所有的平移、旋转等等变换计算为了照顾到平移这类仿射变换统一用 4x4 矩阵来计算既能满足场景又方便计算。