0

私は Android で OpenGL ES 2.0 を使用しており、次のようにディスプレイを初期化しています。

float ratio = (float) width / height;
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);  //Using Orthographic as developing 2d

私が理解に苦しんでいるのはこれです:

私のアプリが「固定画面」ゲームであるとしましょう(パックマンのように、スクロールせず、ゲーム全体が画面に表示されるだけです)。

現時点では、x と y の両方で -1 から +1 にクワッドを描画すると、次のようになります。

ここに画像の説明を入力

明らかに、これは上記のように -ratio, ratio を設定しているためです。したがって、これは正しいです。

しかし、これを「全体」画面として使用することになっていますか? 左右にかなり大きなレターボックスがありますか?

物理ディスプレイの全高 (および可能な限り幅) である長方形のディスプレイが必要ですが、これは -1 未満で +1 を超える描画を意味します。これは問題ですか?

これがスクロール ゲームの場合、クリッピングを使用するオプションがあることは理解していますが、この特定のシナリオでは、画面上の「ゲーム ボード」全体を静的にしたい (そして、利用可能な画面領域をできるだけ多く使用するために) 「ストレッチ」せずに、スプライトの伸びを引き起こします)。

画面の上部として 0,0 を使用するのが好きなので、基本的には次のように draw メソッドを渡します。

quad1.drawQuad (10,0);

drawQuad メソッドがこれを取得すると、基本的には、openGL で表現されているように左から右に範囲を取り、画面の幅を分割します (つまり、私の場合は -1.7 から +1.7 で、3.4/2560 = 0.001328125)。そして、(上記のように) X として 10 を指定すると、次のようになります。

-1.7 + (10*0.001328125) = -1.68671875

次に、クワッドを -1.68671875 にプロットします。

これを行うと、通常の座標で作業できます (y 軸を加算するのではなく減算するだけなので、上部に 0 を設定できます)。

これは物事を行う良い方法ですか?

この方法では、現時点で 100,100 の正方形を指定すると、正方形ではなく、長方形になるためです。ただし、プラス面として、クワッドを幅 x 高さでスケーリングすることにより、物理画面全体を埋めることができます。

4

1 に答える 1

0

1x1 のクワッドを描画しているため、1x1 のクワッドが表示されます。クワッド 0.25 を右または左に移動してみてください。そのスペースにも描画できることがわかります。

グラフィックスでは、クワッドのようなオブジェクトを作成します。この場合、1x1 にします。次に、好きな場所に配置します。配置しない場合は、原点に配置されます。これが表示されます。

より広い形状を描画すると、画面上のこの領域の外にも描画できることがわかります。

ところで、オルソ マトリックス関数では、画面の縦横比を指定するだけでなく、操作する必要がある座標単位のサイズも指定しています。これが、上限と下限の境界が 1 と -1 に設定されているため、1x1 が画面の高さを埋めている理由です。幅が高さよりも長いため、比率は 1 より少し大きいため、左と右の境界は基本的に -1.5 と 1.5 のようなものです (比率がどうであれ)。

しかし、次のようなこともできます。

Matrix.orthoM(mProjMatrix, 0, -width/2, width/2, -height/2, height/2, 3, 7);

ここでは、比率は同じですが、スクリーン座標でオルソ投影に送信しています。(免責事項:私はあなたと同じ数学ライブラリを使用していませんが、これらはあなたがそれに渡す引数に基づく従来のオルソ行列関数のようです)。

1000x500 ピクセルの解像度があるとしましょう。OpenGL では、原点 0,0 は真ん中にあります。左端は (-500,y)、右端は (500,y)、上端は (x,250) です。したがって、1x1 の四角形を描くと非常に小さくなりますが、250x250 の正方形を描くと、前のオルソ投影の 1x1 の四角形のように見えます。

そのため、どのように作業したいかについて、必要な座標、比率、単位サイズなどを指定できます。個人的には、座標を 0 と 1 の間の分数として指定するのは好きではありません。画面のピクセルと同じ意味で考えるのが好きです。

しかし、これを行うかどうかにかかわらず、これらの行列関数に実際に何を渡しているかを理解していることを願っています。

学習するための最良の方法の 1 つは、オブジェクトを画面に描画し、modelview と射影行列に送信するさまざまな数値をいじってみることです。これにより、それらが実際に何をしているかを確認できます。

于 2013-04-07T13:56:48.180 に答える