从矩阵的定义开始谈OpenGL矩阵变换

前言

最近自己想用C语言写一个Minecraft clone(GitHub链接:http://github.com/CharlesDong/m3c/),因为是现代OpenGL,又是C语言,GLM用不了,就要自己写OpenGL矩阵变换,发现自己对具体的变换也不了解,于是决定写一篇博客来总结.

矩阵的定义

先从2D场景说起.先从一个最简单的问题开始.

Q1:一个点P(x,y)它关于原点O的对称点为P'(x',y'),请问x',y'与x,y有什么关系?

A1从矩阵的定义开始谈OpenGL矩阵变换

下面两个问题稍微难一些。

Q2:点从矩阵的定义开始谈OpenGL矩阵变换绕O逆时针旋转45°,得到点P'(x', y'),求P'的坐标。

A2:设P坐标为P(x,y),且满足

从矩阵的定义开始谈OpenGL矩阵变换

由题意

从矩阵的定义开始谈OpenGL矩阵变换

P旋转45°后得到P'(x',y'),由三角函数知识可得

从矩阵的定义开始谈OpenGL矩阵变换

由公式从矩阵的定义开始谈OpenGL矩阵变换从矩阵的定义开始谈OpenGL矩阵变换可得

从矩阵的定义开始谈OpenGL矩阵变换

从矩阵的定义开始谈OpenGL矩阵变换

所以P'坐标为从矩阵的定义开始谈OpenGL矩阵变换.

Q3:点P(x,y)绕O逆时针旋转且旋转角为α,得到P(x',y'),请问x',y'与x,y有什么关系?

A3:设从矩阵的定义开始谈OpenGL矩阵变换

从矩阵的定义开始谈OpenGL矩阵变换

从矩阵的定义开始谈OpenGL矩阵变换

从矩阵的定义开始谈OpenGL矩阵变换

设P(x,y)经过某种变换之后得到点P'(x',y'),且满足从矩阵的定义开始谈OpenGL矩阵变换,则这种变换被称为线性变换(linear transformation).为方便,我们把这种变换记作一个正方形数表

从矩阵的定义开始谈OpenGL矩阵变换

这种数表被称为矩阵(matrix)。这里这个数表是2x2的,因此被称为二阶矩阵。例如Q1中,矩阵为从矩阵的定义开始谈OpenGL矩阵变换;Q2中,矩阵为从矩阵的定义开始谈OpenGL矩阵变换Q3中,矩阵为从矩阵的定义开始谈OpenGL矩阵变换

为方便,我们将点P(x,y)理解为一个从O指向P的向量,将(x,y)称为向量OP的坐标。讨论矩阵时,可以认为点P和向量OP是等价的,不区分它们。点P(x,y)经过某种变换后得到点P'(x',y'),与向量v(x,y)经过某种变换后得到向量v'(x',y')两种说法等价。

像矩阵一样,(x,y)也可以写成一列的形式

从矩阵的定义开始谈OpenGL矩阵变换

这种形式的向量被称为列向量

矩阵运算(矩阵乘向量)

如果向量v经过矩阵M的变换后得到一个新的向量v',我们为方便,就会说向量v'是矩阵M与向量v的乘积,记为v'=Mv.注意矩阵要在前面,不能写成v'=vM.

如果矩阵M1,M2分别和向量v相乘(也就是向量v经过M1,M2的变换后),得到一个新的向量v',记作从矩阵的定义开始谈OpenGL矩阵变换.

矩阵运算(矩阵乘矩阵)

如果有3个矩阵M1、M2和M,对于向量v,M2M1v得到的结果和Mv相等,可以认为矩阵M1、M2所共同产生的变换等于矩阵M的变换。这种情况下,我们会说M1与M2的乘积等于M,用公式表示就是M1M2=M。

(to be continued)

上一篇:邮件江湖群狼环伺 U-Mail邮件系统防狼有术


下一篇:ios下虚拟键盘出现"搜索"字样