OpenGL-06-02练习题
02 OpenGL 06 练习题
2023-09-11 14:22:30 时间
OpenGL-06-02练习题
一、对GLM的projection
函数中的FoV
和aspect-ratio
参数进行实验。看能否搞懂它们是如何影响透视平截头体的。
projection = glm::perspective(glm::radians(45f), (float)SCR_WIDTH / SCR_HEIGHT, 0.1f, 100.0f);
主要对第一个参数和第二个参数进行测试
首先测试第一个参数
45度时
70度时
30度时
显然,我们可以直观的感受到,这个参数控制的是视野大小,视野小的时候,我们看到东西就比较少,物体就比较大。
视野大的时候,我看到的东西就比较多,物体就比较小
接下来我们在45度视野下测试第二个参数
正常情况下
乘以2
除以2
其实已经很明显了,屏幕比乘以一个数,屏幕会被垂直拉伸,屏幕比除以一个数,屏幕会被水平拉伸
二、将观察矩阵在各个方向上进行位移,来看看场景是如何改变的。注意把观察矩阵当成摄像机对象。
这里我们定义两个全局float
变量
float cameraX=0.0f;
float cameraZ=-3.0f;
并将他们赋给观察矩阵
view = glm::translate(view, glm::vec3(cameraX, 0.0f, cameraZ));
在通过键盘去控制这两个值的变化,我们就可以手动控制摄像机的移动了!
通过WASD控制摄像机前后左右的移动,是不是很有趣!
void moveInput(GLFWwindow *window){
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
cameraZ+=0.1f;
}
else if(glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
cameraZ-=0.1f;
}
else if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
cameraX+=0.1f;
}
else if(glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
cameraX-=0.1f;
}
}
三、使用模型矩阵只让是3倍数的箱子旋转(以及第1个箱子),而让剩下的箱子保持静止。
很容易不在过多解释
//每次渲染前,清除之前的深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(VAO);
for (unsigned int i = 0; i < 10; i++)
{
// calculate the model matrix for each object and pass it to shader before drawing
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, cubePositions[i]);
float angle = glfwGetTime()*50+20;
if(i==0||i%3==0){
model=glm::rotate(model,glm::radians(angle),glm::vec3(1.0f,0.3f,0.5f));
model=glm::translate(model,glm::vec3(2,0,0));
ourShader.setMatrix4("model",model);
}else{
model=glm::rotate(model,glm::radians(10.0f),glm::vec3(1.0f,0.3f,0.5f));
ourShader.setMatrix4("model",model);
}
glDrawArrays(GL_TRIANGLES, 0, 36);
}