矩阵
矩阵。相当于一个二维数组,有自己的运算规则。先来复习一下关于矩阵的加减乘除的一些基本运算。
矩阵的加法
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D421/sign=0f97b8cb332ac65c63056771caf3b21d/e61190ef76c6a7effb0bcc8dfbfaaf51f3de666f.jpg)
矩阵的减法
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D450/sign=9d64eea5b73533faf1b6922b98d2fdca/80cb39dbb6fd526654aa5bbfad18972bd5073693.jpg)
它的加法就是把两个矩阵对应位置的元素加起来放在结果矩阵对应的位置上。应该注意的是只有同型矩阵之间才可以进行加减法。也就是矩阵的加减要求两边的矩阵必须尺寸相等。
矩阵的乘法
![](https://img2018.cnblogs.com/blog/836316/201812/836316-20181218161951260-1348999271.png)
变换矩阵
在图形绘制过程中,有三种变换,分别是平移,缩放,旋转。如果我们想要用代码表示一个3D环境中的变换需要几个变量呢,首先要有平移tx, ty, tz
,然后是缩放sx, sy, sz
,最后是旋转rx, ry, rz
。在渲染的时候把这些变量附加到原始的位置数据上就可以实现变换了。这种方式虽然可行但不够好,尤其是在GPU上这种方式产生的运算负担远大于使用矩阵。
代码实现
float varyingFactor = sin(self.elapsedTime); GLKMatrix4 scaleMatrix = GLKMatrix4MakeScale(varyingFactor, varyingFactor, 1.0); GLKMatrix4 rotateMatrix = GLKMatrix4MakeRotation(varyingFactor , 0.0, 0.0, 1.0); GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(varyingFactor, 0.0, 0.0); // 矩阵会按照从右到左的顺序应用到position上。也就是先缩放(scale),再旋转(rotate),最后平移(translate) // 如果这个顺序反过来,就完全不同了。从线性代数角度来讲,就是矩阵A乘以矩阵B不等于矩阵B乘以矩阵A。 self.transformMatrix = GLKMatrix4Multiply(translateMatrix, rotateMatrix); self.transformMatrix = GLKMatrix4Multiply(self.transformMatrix, scaleMatrix);
static GLfloat triangleData[36] = { 0, 0.5f, 0, 1, 0, 0, -0.5f, 0.0f, 0, 0, 1, 0, 0.5f, 0.0f, 0, 0, 0, 1, 0, -0.5f, 0, 1, 0, 0, -0.5f, 0.0f, 0, 0, 1, 0, 0.5f, 0.0f, 0, 0, 0, 1, }; [self bindAttribs:triangleData]; glDrawArrays(GL_TRIANGLES, 0, 6);