설명한 내용은 해상도 독립성을 제공하기에 전적으로 적절하고 적합 합니다. 당신이 그리는 것은 실제로 항상 같은 비율의 창을 차지합니다.
그러나이 이상을 수행하지 않으면 종횡비 문제가 발생합니다. 예를 들어, 쓴 숫자가 주어지면 원을 그리면 수평 스케일이 800 / (50 + 50) = 8이고 수직 스케일이 600 / (50+이기 때문에 키가 큰 것보다 넓습니다. 50) = 6.
이 문제에 대한 자동 해결책은 없습니다 . 원하는 그래픽 결과를 선택하고 게임 플레이에 미치는 영향을 고려해야합니다. 몇 가지 일반적인 예 :
HUD가없는 투시 투영 3D 게임에서 일반적인 간단한 솔루션 (의 일부로 OpenGL에서 사용 가능 gluPerspective
)은 수직 치수를 기준으로 투영 시야를 고정시키는 것입니다. 입니다. 즉, 이러한 게임에서 창의 크기를 가로로 조정하면 장면의 어느 정도가 보이고 이미지의 중간 부분이 전혀 바뀌지 않습니다.
동일한 아이디어를 2D / 2.5D 뷰에도 적용 할 수 있습니다.
(이로 인해 플레이어는 넓지 만 키가 크지 않은 창을 만들어 시야를 가로로 확대 할 수 있습니다. 경쟁이 치열한 멀티 플레이어 게임에서는 원치 않을 수 있습니다.)
가로 세로 비율이 고정 된 뷰포트로 채워진 그래픽이 있거나 (예 : 스크롤하지 않는 2D 맵 또는 장식 테두리) 레이아웃을 변경할 수없는 경우 두 개에 검은 막대가있는 것과 같은 작업을 수행해야합니다 사용하지 않는 공간을 채우기 위해 측면.
또는 가장자리 주변에 주제 적으로 일관된 필러 재료가있는 그래픽을 만들 수 있습니다. 립니다 게임 플레이를 해치지 않고 디스플레이에 맞게합니다.
다른 그래픽 위에 HUD가있는 경우 각 HUD 요소가 창의 일부 (왼쪽 위, 아래쪽 가운데 등)에 고정되어 좌표를 계산할 수 있습니다. 다양한 종횡비의 '스트레칭'은 HUD 요소 사이의 '공백'에 의해 흡수됩니다.
문제의 특정 수학에 관해서는 해상도 독립성을 고려할 때 시작해야 할 종횡비는 단일 숫자 width / height
입니다. 예를 들어, 창이 정사각형이면 1이됩니다. 800 x 600이면 800/600 = 4/3 = 1.333̅입니다.
예를 들어, 창을 넓히면 왼쪽과 오른쪽에 추가 공간을 확보하기 위해 작성한 직교 투영법 을 원한다고 가정하십시오 . 다음과 같이 할 수 있습니다.
float aspect = width / height;
glViewport(0, 0, width, height);
glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);
이를 통해 창 높이가 최소 인 창에 대해 -50에서 50 사이의 x 및 y 좌표로 그리는 모든 것을 볼 수 있습니다.
반면에, 창이 키보다 좁 으면 -50에서 50까지의 범위가 잘립니다. 항상 표시되도록 (창이 정사각형이면 컨텐츠가 최대 크기이지만 그렇지 않은 경우에는 더 작게) 확인하고 싶다고 가정 해 봅시다. 이 경우 너비 대신 높이와 동일한 작업을 수행하면됩니다.
float aspect = width / height;
glViewport(0, 0, width, height);
if (aspect >= 1.0)
glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);
else
glOrtho(-50.0, 50.0, -50.0 / aspect, 50.0 / aspect, 1.0, -1.0);
두 번째 경우에는 곱하기보다는 나눕니다. 이것은 단순히 종횡비를 계산 width / height
하지 않고 계산했기 때문입니다 height / width
. 그 방법을 이해하기가 더 쉽다면 상호를 취하십시오.
다시 말하지만 이것이 종횡비를 관리하는 유일한 방법은 아닙니다. 콘텐츠가 손상되거나 잘리지 않도록하기위한 매우 간단한 방법입니다. 그림 밖으로 오류가 발생하는 것이 당신의 창이 넓은 높이, 또는 어떤 경우; 그런 다음 수학을 연습하십시오.