Я предполагаю, что вы хотите достичь "квадратной" проекции, например когда вы рисуете круг, вы хотите, чтобы он был похож на круг, а не на эллипс.
Единственное, с чем вам следует играть, это соотношение сторон проекции (камеры). В обычных случаях мониторы сохраняют пиксели квадратными, и все, что вам нужно сделать, это установить соотношение сторон вашей камеры, равное соотношению сторон вашего окна просмотра:
viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;
В растянутом случае, который вы описываете (например, изображение 4: 3, растянутое на экране 16:10), пиксели больше не квадратные, и вы должны учитывать это в соотношении сторон вашей камеры:
stretch_factor_x = screen_size_x / viewport_res_x;
stretch_factor_y = screen_size_y / viewport_res_y;
pixel_aspect_ratio = stretch_factor_x / stretch_factor_y;
viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio * pixel_aspect_ratio;
Где screen_size_x
и screen_size_y
- кратные реальному размеру монитора (например, 16:10).
Однако вы должны просто использовать квадратные пиксели (если у вас нет особых причин не делать этого), поскольку монитор может сообщать системе неверные данные о физических размерах или вообще не сообщать. Также мониторы не всегда растягиваются, например, у меня сохраняется соотношение сторон 1: 1 и добавляются черные границы для более низких разрешений.
Редактировать
Если вы хотите настроить окно просмотра в соответствии с некоторым соотношением сторон и подогнать его к произвольному разрешению, вы можете сделать следующее:
viewport_aspect_ratio = 16.0 / 10.0; // The aspect ratio you want your viewport to have
screen_aspect_ratio = screen_res_x / screen_res_y;
if (viewport_aspect_ratio > screen_aspect_ratio) {
// Viewport is wider than screen, fit on X
viewport_res_x = screen_res_x;
viewport_res_y = viewport_res_x / viewport_aspect_ratio;
} else {
// Screen is wider than viewport, fit on Y
viewport_res_y = screen_res_y;
viewport_res_x = viewport_res_y * viewport_aspect_ratio;
}
camera_aspect_ratio = viewport_res_x / viewport_res_y;