一、入门:“变换”、“坐标系统”和“摄像机”
1.6 变换
-
本章节的数学讲解与推导内容请看官网,或games101笔记,以下均为实践内容
-
GLM库的介绍与安装,详细请看官网
-
以下是用于平移与旋转变换的代码
// create transformations glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f)); transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
-
练习
1.7 坐标系统
-
本章节的数学讲解与推导内容请看官网,或games101笔记,以下均为实践内容
-
进入3D
- 让我们变换一下我们的平面,将其绕着x轴旋转,使它看起来像放在地上一样。这个模型矩阵看起来是这样的:
glm::mat4 model; model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
- 然后,将矩阵向我们要进行移动场景的反方向移动
glm::mat4 view; // 注意,我们将矩阵向我们要进行移动场景的反方向移动。 view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
- 最后我们需要做的是定义一个投影矩阵。我们希望在场景中使用透视投影,所以像这样声明一个投影矩阵:
glm::mat4 projection; projection = glm::perspective(glm::radians(45.0f), screenWidth / screenHeight, 0.1f, 100.0f);
- 既然我们已经创建了变换矩阵,我们应该将它们传入着色器。首先,让我们在顶点着色器中声明一个uniform变换矩阵然后将它乘以顶点坐标
#version 330 core layout (location = 0) in vec3 aPos; ... uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { // 注意乘法要从右向左读 gl_Position = projection * view * model * vec4(aPos, 1.0); ... }
- 我们还应该将矩阵传入着色器(这通常在每次的渲染迭代中进行,因为变换矩阵会经常变动):
int modelLoc = glGetUniformLocation(ourShader.ID, "model")); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); ... // 观察矩阵和投影矩阵与之类似
-
更多的3D
- Z缓冲,即深度缓冲,通过其进行深度测试
- 想启用深度测试,需要开启GL_DEPTH_TEST:
glEnable(GL_DEPTH_TEST);
- 因为我们使用了深度测试,我们也想要在每次渲染迭代之前清除深度缓冲(否则前一帧的深度信息仍然保存在缓冲中)。就像清除颜色缓冲一样,我们可以通过在glClear函数中指定DEPTH_BUFFER_BIT位来清除深度缓冲:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
渲染更多次立方体
glBindVertexArray(VAO); for(unsigned int i = 0; i < 10; i++) { glm::mat4 model; model = glm::translate(model, cubePositions[i]); float angle = 20.0f * i; model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f)); ourShader.setMat4("model", model); glDrawArrays(GL_TRIANGLES, 0, 36); }
1.8 摄像机
-
本章节的数学讲解与推导内容请看官网,或games101笔记,以下均为实践内容
-
摄像机/观察空间
- 摄像机位置
- 摄像机方向
- 右轴
- 上轴
-
Look At
-
自由移动
-
移动速度
-
视角移动
-
鼠标输入
-
缩放
-
摄像机类
- 以上内容都总结于这一类中,查看代码理解即可