あなたが説明したことは、解像度の独立性を提供するために完全に適切で適切です。実際に描画するものは、常にウィンドウの同じ割合を占めます。
ただし、これ以上何もしないと、アスペクト比の問題が発生します。たとえば、書いた数字を考えると、円を描くと、それはつぶれます-横の目盛りは800 /(50 + 50)= 8で、縦の目盛りは600 /(50+ 50)= 6。
この問題の自動解決策はありません。必要なグラフィック結果を選択し、ゲームプレイへの影響を考慮する必要があります。一般的な例:
HUDのない透視投影3Dゲームでは、通常の簡単な解決策(OpenGLの一部として利用可能gluPerspective
)は、垂直寸法に対して投影の視野を固定することです。これは、このようなゲームでは、ウィンドウを水平方向にサイズ変更すると、シーンが多少表示され、画像の中央部分がまったく変化しないことを意味します。
同じ考え方を2D / 2.5Dビューにも適用できます。
(これにより、プレイヤーは幅が広いが高さのないウィンドウを作成することにより、視野を水平方向に拡大できることに注意してください。これは、競争力のあるマルチプレイヤーゲームでは望ましくない場合があります。)
アスペクト比が固定されたビューポート塗りつぶしグラフィックス(スクロールしない2Dマップ、装飾的な境界線など)がある場合、またはレイアウトを変更できない場合は、2つの部分に黒いバーを付けるなどの操作を行う必要があります。サイドを使用して未使用のスペースを埋めます。
または、ゲームプレイを損なうことなく、ディスプレイに合うようにトリミングできるエッジの周りにテーマ的に一貫したフィラー材料を含むグラフィックを作成できます。
他のグラフィックスの上にHUDがある場合、各HUD要素がウィンドウの一部(左上、中央下など)に固定されていると判断し、その座標を計算できます。アスペクト比を変化させる「ストレッチ」は、HUD要素間の「空白」に吸収されます。
問題の特定の数学に関しては、解像度の独立性を実行していることを考えると、最初に必要なのはアスペクト比、1つの数字だけです: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);
これにより、少なくともウィンドウと同じ高さのウィンドウでは、x座標とy座標が-50から50の範囲内で描画したものがすべて表示されることが保証されます。
一方、ウィンドウの高さが幅よりも狭い場合は、-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);
2番目のケースでは、乗算ではなく除算に注意してください。これは、単にアスペクト比をとしてwidth / height
ではなく、として計算したためheight / width
です。そのように理解しやすいと思う場合は、逆数を取ります。
繰り返しますが、これはアスペクト比を管理する唯一の方法ではありません。これは、コンテンツが押しつぶされたり切断されたりしないようにするための非常に簡単な方法です。見つけ出すあなたが起こるしたいのか、あなたの窓が広い場合、背の高い、または何でも。それからそれの数学を解決します。