zl程序教程

您现在的位置是:首页 >  其它

当前栏目

OpenGL-06-02练习题

02 OpenGL 06 练习题
2023-09-11 14:22:30 时间

OpenGL-06-02练习题

一、对GLM的projection函数中的FoVaspect-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);
        }