在OpenGL中,摄像机(Camera)并不是一个实际的对象,而是一种从3D场景中选择视角的方式。OpenGL本身没有摄像机的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机。这样就可以产生一种我们在移动的感觉,而不是场景在移动Source 0, Source 1, Source 2, Source 14。
在实际的编程中,我们通常会创建一个Camera类来封装摄像机的状态和行为。这个类通常包含以下几个主要的成员变量:
Position:摄像机的位置
Front:摄像机的前向量,指示摄像机看向哪个方向
Up:摄像机的上向量,指示摄像机的上方向
Right:摄像机的右向量,指示摄像机的右方向
这个类还通常包含一些函数,用于处理用户的输入和更新摄像机的状态。例如,处理键盘输入的ProcessKeyboard函数,处理鼠标输入的ProcessMouseMovement函数,以及处理鼠标滚轮输入的ProcessMouseScroll函数。这些函数会根据用户的输入来更新摄像机的位置和朝向。
最后,Camera类通常还会有一个GetViewMatrix函数,它会根据摄像机的位置和朝向来计算出视觉矩阵(View Matrix)。这个矩阵然后可以被传递给顶点着色器,用于将世界坐标系下的顶点坐标转换到摄像机坐标系下。
以下是一个Camera类的基本结构:
class Camera
{
public:
glm::vec3 Position;
glm::vec3 Front;
glm::vec3 Up;
glm::vec3 Right;
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);
glm::mat4 GetViewMatrix();
void ProcessKeyboard(Direction direction, float deltaTime);
void ProcessMouseMovement(float xoffset, float yoffset, GLboolean constrainPitch = true);
void ProcessMouseScroll(float yoffset);
private:
void updateCameraVectors();
};
可以在LearnOpenGL的摄像机教程中找到更详细的信息和完整的Camera类的实现。