参考教程
【中文版】变换
【英文版】Transformations
学习目录
- 使用GLM数学库进行模型矩阵的平移
- 使用GLM数学库进行模型矩阵的缩放
- 使用GLM数学库进行模型矩阵的旋转
学习心得
这篇文章中关于矩阵的计算(加减乘除等等)参考:矩阵运算
平移
首先看平移,在此我们使用上一篇文章中的项目作为基础来进行立方体的平移。我们的立方体如下:
在此我们注意到之前代码中的MVP变量(Model,View,Projection),三个矩阵分别代表模型,视图,投影,而今天的操作平移是针对模型矩阵。首先修正我们摄像机的位置,将其改为在Z轴上方,即0,0,5
位置
1 | // Camera matrix |
其次修改投影矩阵,将视角放大一些(将glm::radians(45.0f)
修改为glm::radians(90.0f)
),即可见区域变大,这样我们在进行平移的时候可以平移更多距离不至于离开视线。
1 | glm::mat4 Projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); |
这时我们的视角将变成从Z轴往下看,之后的平移旋转操作将围绕X和Y轴进行,这是我们转换摄像机后的运行截图:
由于我们摄像机位置的X,Y都是0,这时候我们看这个立方体的时候只能看到一个面,看起来像是一个平面正方形。
glm库中给我们提供了创建平移矩阵的方法 glm::translate,这个api的介绍为
Builds a translation 4 * 4 matrix created from a vector of 3 components.
即使用一个vec3来创建平移矩阵(vec3自然是X , Y , Z三轴的值了),举个例子现在要向X轴正方向平移1,则使用glm::translate
方法应该如下:
1 | glm::mat4 trans = glm::translate(glm::mat4(), glm::vec3(1.0f, 0.0f, 0.0f)); |
创建好平移矩阵,将其与Model相乘
1 | Model = Model * trans; |
之后再进行投影,视图,模型的矩阵相乘就可以了。我们将这一段放在我们的主循环里,但是编译运行后发现会直接看不到立方体了,这种情况是因为计算机处理的速度太快,在我们没看到的情况下已经平移出了摄像机可见区域。将vec3里的赋值改为0.001或者0.01即可。
缩放
缩放对我们来说也是很简单的,glm也提供了构造缩放矩阵的方法glm::scale
Builds a scale 4 * 4 matrix created from 3 scalars.
使用方法和平移差不多,三个参数即是X,Y,Z,当然我们要是放到主循环的话肯定要将数字设置的接近1一些,这样无论是放大还是缩小都能给我们看到的时间。
1 | Model = Model * glm::scale(glm::mat4() , glm::vec3(0.999f,0.999f,0.999f)); |
旋转
旋转矩阵的构建是比较麻烦的,但是glm已经提供给了我们可用的api,即glm::rotate
Builds a rotation 4 * 4 matrix created from an axis vector and an angle expressed in degrees.
由这句介绍可以看到,我们所需要给出的参数是X,Y,Z的坐标和角度,即绕着哪一个轴旋转,假如现在要绕着X轴旋转,即:
1 | Model = Model * glm::rotate(glm::mat4() , glm::radians(90.0f)/1000, glm::vec3(-1.0f, 0.0f, 0.0f)); |
这里我们使用了glm::radians,是一个转换函数,将角度转换为弧度,之所以给转换后的弧度值除以1000也是因为要让他旋转的慢一些,可以看得更清楚。