#ifndefCAMERA_H#defineCAMERA_H#include<glad/glad.h>#include"glm/glm.hpp"#include"glm/gtc/matrix_transform.hpp"#include<vector>// Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methodsenumCamera_Movement{
FORWARD,
BACKWARD,
LEFT,
RIGHT
};//默认相机参数constfloat YAW =-90.0f;constfloat PITCH =0.0f;constfloat SPEED =2.5f;constfloat SENSITIVITY =0.1f;constfloat ZOOM =45.0f;classCamera{public:// 相机属性
glm::vec3 Position;
glm::vec3 Front;
glm::vec3 Up;
glm::vec3 Right;
glm::vec3 WorldUp;// 欧拉角float Yaw;float Pitch;// 选项float MovementSpeed;float MouseSensitivity;float Zoom;//向量构造Camera(glm::vec3 position = glm::vec3(0.0f,0.0f,0.0f), glm::vec3 up = glm::vec3(0.0f,1.0f,0.0f),float yaw = YAW,float pitch = PITCH):Front(glm::vec3(0.0f,0.0f,-1.0f)),MovementSpeed(SPEED),MouseSensitivity(SENSITIVITY),Zoom(ZOOM){
Position = position;
WorldUp = up;
Yaw = yaw;
Pitch = pitch;updateCameraVectors();}// 标量值构造Camera(float posX,float posY,float posZ,float upX,float upY,float upZ,float yaw,float pitch):Front(glm::vec3(0.0f,0.0f,-1.0f)),MovementSpeed(SPEED),MouseSensitivity(SENSITIVITY),Zoom(ZOOM){
Position = glm::vec3(posX, posY, posZ);
WorldUp = glm::vec3(upX, upY, upZ);
Yaw = yaw;
Pitch = pitch;updateCameraVectors();}// returns the view matrix calculated using Euler Angles and the LookAt Matrix
glm::mat4 GetViewMatrix(){return glm::lookAt(Position, Position + Front, Up);}// processes input received from any keyboard-like input system. Accepts input parameter in the form of camera defined ENUM (to abstract it from windowing systems)voidProcessKeyboard(Camera_Movement direction,float deltaTime){float velocity = MovementSpeed * deltaTime;if(direction == FORWARD)
Position += Front * velocity;if(direction == BACKWARD)
Position -= Front * velocity;if(direction == LEFT)
Position -= Right * velocity;if(direction == RIGHT)
Position += Right * velocity;}// processes input received from a mouse input system. Expects the offset value in both the x and y direction.voidProcessMouseMovement(float xoffset,float yoffset, GLboolean constrainPitch =true){
xoffset *= MouseSensitivity;
yoffset *= MouseSensitivity;
Yaw += xoffset;
Pitch += yoffset;// make sure that when pitch is out of bounds, screen doesn't get flipped//保证如果超出范围 屏幕不会翻转if(constrainPitch){if(Pitch >89.0f)
Pitch =89.0f;if(Pitch <-89.0f)
Pitch =-89.0f;}//更新向量updateCameraVectors();}// processes input received from a mouse scroll-wheel event. Only requires input on the vertical wheel-axis//处理滚轮voidProcessMouseScroll(float yoffset){
Zoom -=(float)yoffset;if(Zoom <1.0f)
Zoom =1.0f;if(Zoom >45.0f)
Zoom =45.0f;}private:// calculates the front vector from the Camera's (updated) Euler AnglesvoidupdateCameraVectors(){// calculate the new Front vector
glm::vec3 front;
front.x =cos(glm::radians(Yaw))*cos(glm::radians(Pitch));
front.y =sin(glm::radians(Pitch));
front.z =sin(glm::radians(Yaw))*cos(glm::radians(Pitch));
Front = glm::normalize(front);// also re-calculate the Right and Up vector
Right = glm::normalize(glm::cross(Front, WorldUp));// normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement.
Up = glm::normalize(glm::cross(Right, Front));}};#endif// !CAMERA_H