8

元の質問

「gluPerspective」、「glViewport」、「gluLookAt」を使用してカメラと画面を操作したいと思います。

どのマトリックスモードにどの機能を適用しますか?そして、私はどのような順序でそれらを使用する必要がありますか?

たとえば、画面とカメラを次のように設定しようとしています:(しかし機能していません!)

glMatrixMode(GL_PROJECTION) // Apply following to projection matrix - is this correct?
glLoadIdentity(); // Reset first
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); // Set perspective
glViewport(0, 0, w, h); // Set viewport

glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
glLoadIdentity(); // Reset first
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); // Set position, centre and then up vectors
// This surely comes after calling GL_MODELVIEW?

私はオンラインドキュメントを探し回っていましたが、機能を理解していますが、どこにどのような順序で配置するかではありません。

今度いつか...

数か月後のことですが、OpenGLでレンダリングするために使用するシステムを表示するためのクイック編集を追加しています。これは、将来この質問を見る他の人を助けるためです。

私は主に2つの方法を使用します。

方法1:

このメソッドは、すべてをグループ化します。

// Firstly, the window may have been resized so re-create the viewing area
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area);

これにより、ウィンドウ内の領域全体にレンダリングするためのビューポートが再作成されます。sfmlを使用すると、window.width()やwindow.height()のようなもの、または使用するウィンドウツールキット(glut、glfw、sdlなど)に応じて同様のことを行うことができます...

// The second step is to add a projection matrix. There are three main ones I like to use
// Uncomment the one you want
glMatrixMode(GL_PROJECTION); // Tell OpenGL to manipulate the correct matrix stack
glLoadIdentity(); // Reset the projection matrix, or bad things happen after multiple calls to below functions!
// glOrtho( ... ) // Uncomment to use 2D rendering
// gluPerspective( ... ) // Uncomment to use (easy) 3D rendering
glFrustrum( ... ) // Uncomment to use (harder/less intuitive?) 3D rendering
glMatrixMode(GL_MODELVIEW); // I always prefer to leave OpenGL in the modelview manipulation mode.
    // I consider it the "default" and safest mode to leave OpenGL in, as any rogue
    // calls to functions changing its contents is likely to mess up your geometry
    // which should be visible as a problem on the screen, which tells you you need
    // to fix something! Manipulating the other matrix stacks may not show obvious
    // problems.

「glOrtho」、「gluPerspective」、「glFrustrum」の3つから1つを選択する必要があります。'gluOrtho2D'もありますが、注意して使用してください。(私は自分で近距離平面と遠距離平面を「glOrtho」で指定することを好みます。)「...」を関数の引数に置き換える必要もあります。

// The third step is to clear the screen and set your camera / geometry position
glClear(GL_COLOR_BUFFER_BIT); // use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required
gluLookAt( ... );
// I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera...
 // That is another fun thing you should try if you are comfortable with 3D geometry and hard math!

// The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing
glutWireTeapot( ... );

方法2:

2番目の方法は上記と同じですが、最初のステップを別の関数に移動します。次に、ウィンドウのサイズ変更イベントを検出して、この関数を呼び出す必要があります。glutを使用すると、コールバックを指定できます。SFMLを使用すると、ウィンドウのサイズが変更されたときにイベントを検出できます。SDLの仕組みを忘れましたが、似ています。glfwがどのように機能するかはまだ学びません。

うまくいけば、それはあなたを助けるでしょう。

一部のOpenGL初心者(おそらく私自身が一度に含まれている)は、PROJECTIONマトリックスでカメラの平行移動を指定しようとします。これをしないでください-私はそれが照明やおそらく他のものを台無しにすることに向かいます。

4

1 に答える 1

3

reshapeコールバック関数を次のように定義します。

glViewport(...)最初に一度電話してください。

次に、射影行列に単位行列を再読み込みします。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

それで:

glPerspective(...)
glMatrixMode(GL_MODELVIEW);

gluLookAt(...)カメラの位置を変更する必要がある場合は、後でいつでも呼び出すことができます。

私の単純な目的のために動作します。

于 2012-10-24T16:34:48.833 に答える