Camera Control ============== Open a window and type in the following code: :: #include #include #include #include #define GLM_FORCE_RADIANS #include #include #include #include "Shader.h" GLfloat mix_value=0.2f; bool keys[1024]; GLfloat delta_time=0.0f; // time between current frame and last frame GLfloat last_frame=0.0f; // time of last frame GLfloat last_X=0.0f,last_Y=0.0f; GLfloat fov=45.0f; GLfloat yaw=-90.0f; // yaw is initialized to -90.0 degrees since a yaw of 0.0 results in a direction vector pointing // to the right (due to how Euler angles work) so we initially rotate a bit to the left. GLfloat pitch=0.0f; bool first_mouse=true; glm::vec3 camera_position=glm::vec3(0.0f,0.0f,3.0f); glm::vec3 camera_front=glm::vec3(0.0f,0.0f,-1.0f); glm::vec3 camera_up=glm::vec3(0.0f,1.0f,0.0f); void do_movement() { // camera controls GLfloat camera_speed=5.0f*delta_time; if(keys[GLFW_KEY_W]) camera_position+=camera_speed*camera_front; if(keys[GLFW_KEY_S]) camera_position-=camera_speed*camera_front; if(keys[GLFW_KEY_A]) camera_position-=glm::normalize(glm::cross(camera_front,camera_up))*camera_speed; if(keys[GLFW_KEY_D]) camera_position+=glm::normalize(glm::cross(camera_front,camera_up))*camera_speed; } void scroll_callback(GLFWwindow *window,double xoffset,double yoffset) { if(fov>=1.0f && fov<=45.0f) fov-=yoffset; if(fov<=1.0f) fov=1.0f; if(fov>=45.0f) fov=45.0f; } void key_callback(GLFWwindow *window,int key,int scancode,int action,int mode) { if(key==GLFW_KEY_ESCAPE && action==GLFW_PRESS) glfwSetWindowShouldClose(window,GL_TRUE); if(key==GLFW_KEY_UP && action==GLFW_PRESS) { mix_value+=0.1f; if(mix_value>1.0f) mix_value=1.0f; } if(key==GLFW_KEY_DOWN && action==GLFW_PRESS) { mix_value-=0.1f; if(mix_value<0.0f) mix_value=0.0f; } if(action==GLFW_PRESS) keys[key]=true; else if(action==GLFW_RELEASE) keys[key]=false; } void mouse_callback(GLFWwindow *window,double xpos,double ypos) { if(first_mouse) { last_X=xpos; last_Y=ypos; first_mouse=false; } GLfloat x_offset=xpos-last_X; GLfloat y_offset=last_Y-ypos; last_X=xpos;last_Y=ypos; GLfloat sensitivity=0.05f; x_offset*=sensitivity; y_offset*=sensitivity; yaw+=x_offset; pitch+=y_offset; if(pitch>89.0f) pitch=89.0f; else if(pitch<-89.0f) pitch=-89.0f; glm::vec3 front; front.x=cos(glm::radians(pitch))*cos(glm::radians(yaw)); front.y=sin(glm::radians(pitch)); front.z=cos(glm::radians(pitch))*sin(glm::radians(yaw)); camera_front=glm::normalize(front); } int main() { glfwInit(); #if __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); #endif glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); GLFWwindow *window=glfwCreateWindow(800,600,"Learn OpenGL",nullptr,nullptr); if(window==nullptr) { std::cout<<"Failed to create GLFW window!"<