我假设你想要得到的是一个“正方形”的投影,例如当你画一个圆的时候,你希望它看起来像一个圆而不是椭圆。
你唯一应该玩的是你的投影(相机)纵横比。通常情况下,监视器保持像素为正方形,您所要做的就是将相机的纵横比设置为与视区的纵横比相等:
viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;
在您描述的拉伸情况下(例如,在16:10屏幕上拉伸的4:3图像),像素不再是方形的,您必须在相机纵横比中考虑到这一点:
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;