1

おそらく簡単な数学の問題があり、それを理解するのに驚くほど苦労しています。サイズ変更可能な LWJGL (OpenGL) ウィンドウがあります。私が作成しているゲームは 2D ですが、glFrustum() を使用してスプライトの深度を取得しています。私の投影コードからの(少し簡略化された)スニペットは次のとおりです。

double divider = 64.0;
double left = -vw / divider;
double right = vw / divider;
double bottom = vh / divider;
double top = -vh / divider;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left * aspect, right * aspect, bottom, top, 8, 65536);

float zModifier = -256;
float vRatio = Game.HEIGHT / Display.getHeight();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-vw / 2.0f, -vh / 2.0f, zModifier * vRatio);

(私は錐台ビットをよく理解していないことを認めなければなりません。インターネットのどこかでこのコードを見つけて、うまく機能しました...)

ただし、スプライトで独自のカーソルをレンダリングしており、カーソルがウィンドウの境界に接触するとネイティブ カーソルに切り替わります。ウィンドウのサイズを変更できるようにするまで、これはすべてうまくいきました。

今私の問題は、ウィンドウのサイズを変更すると、ネイティブカーソルがvRatio. サイズ変更されたウィンドウサイズに応じて、少し、またはもう少し「ジャンプ」します。

スプライト カーソルが境界線に接触したら、次のようにします。

  1. スプライトカーソルを隠す
  2. ネイティブ カーソルを表示する
  3. ネイティブ カーソルの位置をスプライト カーソルの位置に設定します(これは正しく機能しなくなりました)

これには簡単な数学的な解決策があるように感じますが、それを理解することはできません(私は試しました...しかし..)。

私の質問が曖昧すぎず、十分な情報を提供したことを願っています!

4

1 に答える 1

1

最初は、ウィンドウ サイズが OpenGL のサイズと一致します。ただし、ウィンドウのサイズを変更すると、投影が変更される必要があります。したがって、少なくとも倍率が追加されます。これは、カーソルが同期していない理由を説明しています。

それらを常に同期させたい場合は、ウィンドウ座標をワールド座標にマップする必要があります。これはgluUnProject OpenGL: gluUnProjectで実現できます。あなたはすでにそれを手作業で行っていますが、問題につながる解像度の変化を考慮していません。

完全を期すために、ワールド座標からウィンドウ座標への逆も可能ですOpenGL: gluProject

これらの関数を使用する場合、モデル マトリックス、射影マトリックス、およびビューポートを使用する必要があります。そのためには、glGet* ファミリーの関数を使用してください。これらのマトリックスが正しく設定されている時点で必ずロードしてください!

于 2012-09-16T13:11:30.170 に答える