【OpenGL学习笔记】摄像机篇
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));