前言
说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到放弃的念头,不慌,作为了一个应用层的CV工程师,在实际应用中线性代数哪些复杂的计算根本不用我们自己去算,绝大部分情境下直接使用这个类或者这个库即可。
关于矩阵与向量的相关知识,矩阵的加减乘除等规则,这里就不展开细说,感兴趣的同学自行查阅线性代数即可,不过这些规则忘记了也没关系,反正有API可用。
我们知道在Opengl中有很多中坐标系,在Opengl中矩阵的一大作用就是将坐标从一个坐标系转换到另一个坐标系下,同时还可以通过矩阵实现一些形变的效果,今天我们就使用矩阵的方式搭配Opengl ES实现平移、缩放、旋转等一些形变变换的效果。
通常来说在Opengl ES中的矩阵都是一个4X4的矩阵,也就是一个包含16个元素的一维数组。
下面以这个类介绍一下矩阵变换的一些常用方法。下面介绍的矩阵变换所参考的坐标系统都是一样的,均是下图这个:
单位矩阵
所谓的单位矩阵就是左上角到右下角对角线值均为1的矩阵,又成为单元矩阵。使用方法可以将一个矩阵变为单位矩阵。
矩阵平移
矩阵平移所使用的方法是。
需要注意的是在Opengl在顶点坐标的值是在-1到1之间,因此translateX的范围可以为-2到2。为什么呢?因为-1到1的距离是2,因此往最多可以往左移动2,同理,最多可以往右移动2。
矩阵旋转
矩阵旋转所使用的方法是,其中第三个参数是表示选旋转的角度,后面的三个参数xyz代表的是绕那个轴旋转,绕那个轴旋转就把那个轴的参数设置成1,其他轴设置成0即可。
矩阵缩放
矩阵缩放所使用的方法是
组合矩阵的写法
假如有以下形变步骤,先绕Z轴旋转90度,再向X轴平移0.5,最后X轴缩放0.9倍,那么最终这个形变矩阵该如何计算呢?是以下这个写法吗?
不是的,组合矩阵的写法有一个规则,这个规则大家一定要记住:
在组合矩阵时,先进行缩放操作,然后是旋转,最后才是位移,但是写法需要反正写,也就是先写translateM,然后rotateM,最后scaleM
如果不这样写会发生什么呢?例如顺着写,先写scaleM,然后是rotateM,最后写translateM,测试时就会出现问题,旋转超过180度之后再移动,就会出现移动方向相反的情况。
因此以上例子正确的写法应该是这样子的:
show me code
在Opengl ES中可以使用来表示一个4X4的矩阵,我们将总的变换矩阵在CPU中计算好之后以的形式传递到着色器中去。在顶点着色器中将矩阵与顶点坐标相乘的结果作为新的顶点输出坐标即可完成矩阵变换。
以下是MatrixTransformOpengl.cpp的详细代码:
java层的MatrixActivity.java实例代码如下:
运行结果Opengl ES系列入门介绍
领取专属 10元无门槛券
私享最新 技术干货