10.1 最简单的相机

在上一小节项目里,其实已经实现了相机功能,就是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);

这两行代码指定了相机的必备属性:

  1. Transform :指定 相机位置 和 朝向。
  2. Filed of View:指定相机可视角度。
  3. Clipping Planes:指定近裁剪面 和 远裁剪面。

下面将其进行封装到Camera类,实现最基础的Camera。

CLion项目文件位于 samples\camera\perspective_camera

1. 基础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_;}

2. 使用Camera

封装了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();
        ......
    }
    ......
}

3. 测试

编译运行,测试是否能正确渲染。

Copyright © captainchen all right reserved,powered by GitbookFile Modify: 2021-06-28 09:56:28

results matching ""

    No results matching ""

    results matching ""

      No results matching ""