#c #opengl #glfw
Вопрос:
Я работаю над компонентом камеры в 2-d игре, но я не понимаю, как настроить рендеринг при изменении размера окна:
P1-это то, как оно выглядит при первом создании окна, и оно правильное. Плеер отображается в левом верхнем углу.
Однако, когда я изменяю размер окна, щелкая и перетаскивая правый нижний угол окна, это выглядит следующим образом:
Как вы можете видеть, плеер отключен от окна просмотра, но я все равно хочу отобразить его так, как в 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 } };