【OpenGL学习笔记】摄像机篇

时间:2025-03-30 08:22:55
double lastX = 0.0; double lastY = 0.0; bool firstMouse = GL_TRUE; GLfloat yaw = -; //Z轴方向是垂直屏幕朝向我们的(90°),那么我们看到的方向就是反的(-90°) GLfloat pitch = 0.0f; //不同库的方法略有不同,这里只写出关键部分 //鼠标事件 void mouse_event(double x,double y,...) { //第一次,给lastX lastY 赋值 if(firstMouse){ lastX = x; lastY = y; firsMouse = GL_FALSE; } //计算移动量 GLfloat offsetX = x - lastX; GLfloat offsetY = lastY - y; //这里是因为Y轴方向是从下往上的 //重新赋值lastX,lastY lastX = x; lastY = y; //控制速度 GLfloat speed = 0.05f; offsetX *= speed; offsetY *= speed; //累计偏航角和俯仰角,滚转角一般用不到 yaw += offsetX; pitch += offsetY; //我们不希望俯仰角超过这个范围,因为那样子感觉太奇怪了,你也可以不设置(如果你是个奇怪的艺术家) if(pitch > 89.0f) pitch = 89.0f; if(pitch < -89.0f) pitch = -89.0f; //下面就是计算公式了,这里就不解释了吧... glm::vec3 temp; temp.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch)); temp.y = sin(glm::radians(pitch)); temp.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch)); front= glm::normalize(temp); } //实现缩放功能(这里还需要设置 透视投影 才有效果,不然的话 正射投影(默认) 是没有效果的) //首先需要修改我们的顶点着色代码, 如下面的 顶点着色器(透视投影) //鼠标滚轮事件 void scroll_event(GLfloat delta,...) { if(aspect >= 1.0f && aspect <= 45.0f) aspect -= delta; if(aspect <= 1.0f) aspect = 1.0f; if(aspect >= 45.0f) aspect = 45.0f; } //赋值部分多了一个 GLfloat aspect = 45.0f; glm::mat4 projection = glm::perspective(aspect, (GLfloat)WIDTH/(GLfloat)HEIGHT, 0.1f, 100.0f); GLint viewLoc = glGetUniformLocation(ourShader.Program, "view"); GLint projectionLoc = glGetUniformLocation(ourShader.Program, "projection"); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(projectionLoc , 1, GL_FALSE, glm::value_ptr(projection));