2

gluOrtho2D()によって設定されたマトリックスを使用してすべてのレンダリングを実行するプログラムをいじっています。私がやりたいのは、y軸(0,1,0)を中心に特定のテクスチャを回転させて、元のマトリックスが代わりにgluPerspective()によって提供されたように見せることです。これは正射影行列では不可能であり、新しい透視投影行列を設定する必要があることを認識しています。描画するテクスチャを、正投影マトリックスで描画したときとまったく同じに見せたいのですが、y軸を中心に回転させた場合を除きます。

要約
すると、図形がxy平面に描画されている場合は特定の正投影行列と同等であるが、xy平面にない場合は遠近法を提供する遠近投影行列を見つけるにはどうすればよいですか?

4

3 に答える 3

4

基本的に私が理解しているのは、オブジェクトがXY平面にあるときに、正投影と同じ画像を生成する遠近法マトリックスが必要なことです。

それでは始めましょう:あなたはXY平面に平面を描きたいと思っていて、それを持っていましたgluOrtho2D(-w, w, -h, h);(非対称正投影は、必要に応じて少し難しいです、そう言ってください)。あなたが今する必要があるのは:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(2 * atan(h / 2)  * 180.0 / PI, w / h, 1, 3);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -2);

ここで行ったことは、正投影で表示されたXY平面のセクションの投影ビュー錐台の中心を一致させることです。

投影錐台といくつかの数学のグラフを取り、あなたはこれを自分で行うことができます:)


念のため、古い質問に対する答えをここに残しておきます。

オルソプロジェクションまたはパースペクティブプロジェクションがあります。あなたは1つを決める必要があります。どの軸を回転しても遠近感は得られません。

投影モードを変更するためだけにプログラム全体を変更する必要があるのはなぜですか?

考えられる解決策の1つ:さまざまなマトリックスモードなどを備えた古いGLを想定しています。

glMatrixMode(GL_PROJECTION); //switch to projection matrix mode
glPushMatrix(); //push the old matrix
glLoadIdentity();
//apply the perspective projection
//do your rendering
glPopMatrix(); //pop the old matrix

新しいGLスキームでは、これのほとんどを自分で行う必要がありますが、それでも簡単なはずです。

于 2012-03-06T16:36:34.097 に答える
0

これは、すべてのプログラムをgluPerspective()を使用するように変換しなくても、簡単な方法で可能ですか?

私はすでにこれを言うのにうんざりしていますが:

投影は、一度定義されてからレンダリングプロセス全体に適用されるものではありません。いつでも切り替えることができ、高度なレンダリングスキームでは、1つのフレーム全体でこれを複数回行います。

私はほとんどの初心者がこれによって混乱していると思います:

reshape(width, height):
    glViewport(0,0,width,height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    projection_setup()

彼らは、リシェイプ関数で行われた投影を見て、それを行う唯一の場所であると考えています。私と話してください: 射影行列は、他のものと同じように描画に使用される状態です。現在の色やテクスチャと同じくらい簡単に変更できます。

描画を行う直前に、必要に応じて、特定の一連の描画コマンドに必要な投影を設定するだけです。

于 2012-03-06T18:29:07.837 に答える
0

投影行列が正投影である場合でも、遠近効果、つまりx軸またはy軸を中心に回転させることができます。秘訣は、他のビュー変換の前後に、この魔方陣によってビューマトリックスを乗算することです。

// The matrix is
// -z,  0,  x,  0
//  0, -z,  y,  0
//  0,  0,  1,  0
//  0,  0,  1, -z

どこ :

  • xビューポートの半分の幅です。
  • yビューポートの半分の高さです。
  • z-0以外の負の数である可能性があります。

いくつかの注意:

  1. glRotate *を呼び出す場合、これらの組み込み呼び出しは右辺の乗算であるため、この行列が最初になります。教科書で提案されているように、左側の乗算を使用して独自のビューマトリックスを追跡する場合、このマトリックスは最後になります。いずれにせよ、この行列は実際には正投影プロジェクトの行列で乗算されるため、uも事前に計算できます
  2. zは実際にはシミュレートされたzの深さであるため、大きさが大きくなるほど、オブジェクトはさらに大きくなり、結果として、回転は正書法のように見えます。これはNDCのwを負にするため、Zを正にすることはできません。OpenGLはそれを許可しません。クリップされるため、何も描画されません。
  3. 結局、魔法はありません。この行列は単なる補償です。uを実行した後:M(ortho)XM(magic)、uは遠近法行列を取得します
  4. コードの99%が正書法用であるが、1つまたは2つの場所だけが遠近効果を必要とする場合、このトリックは非常に重要です。固定パイプラインを使用している場合、GL_PROJECTION_MATRIXは変更されません。
  5. このマトリックスはAndroidOpenSource Projectから取得されているため、これで自信が持てるようになることを願っています。
于 2013-07-08T09:45:11.940 に答える