Как настроить положение экрана при изменении размера окна (glfw/opengl)

#c #opengl #glfw

Вопрос:

Я работаю над компонентом камеры в 2-d игре, но я не понимаю, как настроить рендеринг при изменении размера окна:

р1

P1-это то, как оно выглядит при первом создании окна, и оно правильное. Плеер отображается в левом верхнем углу.

Однако, когда я изменяю размер окна, щелкая и перетаскивая правый нижний угол окна, это выглядит следующим образом:

р2

Как вы можете видеть, плеер отключен от окна просмотра, но я все равно хочу отобразить его так, как в p1, чтобы мы могли видеть игрока в левом верхнем углу.

У меня есть frame_buffer_callback такой:

 void WorldSystem::on_resize(int width, int height) { 
    //vec2 player_pos = MapUtility::map_position_to_screen_position(registry.map_positions.get(player).position);
    glViewport(0, 0, width, height); 
    printf("resizingn");
}
 

и моя матрица проекции построена на основе положения объекта камеры:

 vec2 camera_screen_position
        = MapUtility::map_position_to_screen_position(camera_map_pos.position);
    vec2 buffer_top_left, buffer_down_right;
    std::tie(buffer_top_left, buffer_down_right) = CameraUtility::get_buffer_positions(camera_screen_position, w*screen_scale, h*screen_scale);

    update_camera_position(camera_map_pos, player_position, buffer_top_left, buffer_down_right);
    vec2 final_camera_screen_position = MapUtility::map_position_to_screen_position(camera_map_pos.position);

    //printf("final camera pos: (%f, %f)n", final_camera_screen_position.x, final_camera_screen_position.y);
    
    float right = final_camera_screen_position.x   w * screen_scale;
    float left = final_camera_screen_position.x;
    float top = final_camera_screen_position.y;
    float bottom = final_camera_screen_position.y   h * screen_scale;

    float sx = 2.f / (right - left);
    float sy = 2.f / (top - bottom);
    float tx = -(right   left) / (right - left);
    float ty = -(top   bottom) / (top - bottom);
    return { { sx, 0.f, 0.f }, { 0.f, sy, 0.f }, { tx, ty, 1.f } };