## 10.1 最简单的相机 在上一小节项目里,其实已经实现了相机功能,就是 中的下面两行代码: 这两行代码指定了相机的必备属性: Transform :指定 相机位置 和 朝向。 Filed of View:指定相机可视角度。 Clipping Planes:指定近裁剪面 和 远裁剪面。 下面将其进行封装到Camera类,实现最基础的Camera。 基础Camera 新建Camera类,将上面代码封装。 另外也提供以下接口提供给Renderer获取当前相机矩阵信息: 使用Camera 封装了 之后,在 中就可以创建 ,然后设置参数,Renderer从 拿到相关矩阵进行计算。 修改 函数如下: 测试 编译运行,测试是否能正确渲染。
在上一小节项目里,其实已经实现了相机功能,就是main.cpp 中的下面两行代码:
///file:samples/export_blender/load_mesh_from_blender/source/main.cpp line:85 //指定相机位置 朝向 glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 10), glm::vec3(0, 0,0), glm::vec3(0, 1, 0)); //指定相机视野范围 glm::mat4 projection=glm::perspective(glm::radians(60.f),ratio,1.f,1000.f);
这两行代码指定了相机的必备属性:
下面将其进行封装到Camera类,实现最基础的Camera。
CLion项目文件位于 samples\camera\perspective_camera
新建Camera类,将上面代码封装。
//file:source/renderer/camera.h line:17 /// 设置相机位置 朝向 /// \param cameraFowrad 相机朝前方向 /// \param cameraUp 相机朝上方向 void SetView(const glm::vec3& cameraFowrad,const glm::vec3& cameraUp); /// 设置相机视野 /// \param fovDegrees 相机视野 可视角度 /// \param aspectRatio 宽高比 /// \param nearClip 近裁剪面 /// \param farClip 远裁剪面 void SetProjection(float fovDegrees,float aspectRatio,float nearClip,float farClip);
另外也提供以下接口提供给Renderer获取当前相机矩阵信息:
glm::mat4& view_mat4(){return view_mat4_;} glm::mat4& projection_mat4(){return projection_mat4_;}
封装了Camera之后,在main.cpp中就可以创建Camera,然后设置参数,Renderer从Camera拿到相关矩阵进行计算。
修改main() 函数如下:
//file:source/main.cpp int main(void) { Application::set_data_path("../data/"); init_opengl(); ...... //创建相机 GameObject auto go_camera=new GameObject("main_camera"); //挂上 Transform 组件 auto transform_camera=dynamic_cast<Transform*>(go_camera->AddComponent("Transform")); transform_camera->set_position(glm::vec3(0, 0, 10)); //挂上 Camera 组件 auto camera=dynamic_cast<Camera*>(go_camera->AddComponent("Camera")); while (!glfwWindowShouldClose(window)) { ...... //设置相机 camera->SetView(glm::vec3(0, 0,0), glm::vec3(0, 1, 0)); camera->SetProjection(60.f,ratio,1.f,1000.f); camera->Clear(); //旋转物体 static float rotate_eulerAngle=0.f; rotate_eulerAngle+=0.1f; glm::vec3 rotation=transform->rotation(); rotation.y=rotate_eulerAngle; transform->set_rotation(rotation); mesh_renderer->SetView(camera->view_mat4()); mesh_renderer->SetProjection(camera->projection_mat4()); mesh_renderer->Render(); ...... } ...... }
编译运行,测试是否能正确渲染。