通过矩阵变换 即相机外参数 包括旋转矩阵和平移矩阵 使得物体进行移动。各类变换矩阵定义如下
缩放矩阵
位移矩阵
旋转矩阵
- 沿x轴旋转
- 沿y轴旋转
- 沿z轴旋转聚合矩阵明显的 这样的旋转方式会造成万向节死锁问题,解决方案为使用四元数
译注对四元数的理解会用到非常多的数学知识。如果你想了解四元数与3D旋转之间的关系,可以来阅读我的教程。如果你对万向节死锁的概念仍不是那么清楚,可以来阅读我教程的Bonus章节。
现在3Blue1Brown也已经开始了一个四元数的视频系列,他采用球极平面投影(Stereographic Projection)的方式将四元数投影到3D空间,同样有助于理解四元数的概念(仍在更新中):https://www.youtube.com/watch?v=d4EgbgTm0Bg
矩阵相乘即可简单的获取顺序化的变换矩阵。
GLM
相关变换矩阵使用库glm
其中有mat4类型的矩阵用于旋转变换
glm::mat4 trans = glm::mat4(1.0f);
//平移
trans = glm::translate(trans, glm::vec3(-0.1f, 0.0, 0.0));
//旋转
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
//缩放
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));
glsl中也有对应mat4的变量 实际上是一个 float[16]
uniform mat4 transform;
[...]
//左乘变换矩阵完成变换操作
gl_Position = transform * vec4(aPos, 1.0);
同样通过uniform变量从C代码中传入
glm::mat4 trans = glm::mat4(1.0f);
int transLocation = glGetUniformLocation(shader.ID, "transform");
glUniformMatrix4fv(transLocation, 1, GL_FALSE, glm::value_ptr(trans));