[訳]GLUTチュートリアル-アニメーション

10916 ワード

Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation
 
前の章では、白い三角形のフォームを作成しました.まだクライマックスではありませんが、今からOpenGLアニメーションの楽しさを感じます.三角形を回転させます
まず、GLUTアプリケーションがアイドル時にレンダリング関数が呼び出されることを通知する.これによりGLUTは呼び出したレンダリング関数を保持するアニメーション効果を有効にすることができる.GLUTは、アプリケーションのアイドルイベントをバインドするためのコールバック関数を登録するための関数glutIdleFuncを提供します.
void glutIdleFunc(void (*func)(void));
func–アイドルイベントがトリガーする関数
 
以前の例では、アプリケーションが空いている場合に、前に定義したエンティティレンダリング関数:renderSceneを呼び出したいと考えていました.main関数のコードは次のとおりです.
int main(int argc, char **argv) {



    // init GLUT and create window

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(320,320);

    glutCreateWindow("Lighthouse3D- GLUT Tutorial");



    // register callbacks

    glutDisplayFunc(renderScene);

    glutReshapeFunc(changeSize);



    // here is the idle func registration

    glutIdleFunc(renderScene);



    // enter GLUT event processing cycle

    glutMainLoop();



    return 1;

}

 
次に、レンダリング関数の詳細について説明する.まず浮動小数点型値の角変数を宣言し、初期値は0.0である.次にrenderScene関数に必要な実装コードを追加する.
float angle = 0.0f;



void renderScene(void) {



    // Clear Color and Depth Buffers

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    // Reset transformations

    glLoadIdentity();

    // Set the camera

    gluLookAt(    0.0f, 0.0f, 10.0f,

            0.0f, 0.0f,  0.0f,

            0.0f, 1.0f,  0.0f);



    glRotatef(angle, 0.0f, 1.0f, 0.0f);



    glBegin(GL_TRIANGLES);

        glVertex3f(-2.0f,-2.0f, 0.0f);

        glVertex3f( 2.0f, 0.0f, 0.0);

        glVertex3f( 0.0f, 2.0f, 0.0);

    glEnd();



    angle+=0.1f;



    glutSwapBuffers();

}

 
注意ここではデュアルバッファが必要です
私たちがmain関数でダブルバッファモードを表示モードとして設定したことを思い出してください.この特徴は、2種類の表示バッファを提供する.現在表示するのはフロントバッファであり、バックグラウンドバッファである.バックグラウンドバッファはバックグラウンドで設定に従って描画する.スイッチバッファの描画コマンドを送信と(例えば、駆動が完了すると前後のバッファが切り替わる)、次のフレームがスクリーンに置き換えるレンダリングされる.
glutSwapBuffers関数は、バックグラウンドに描かれたバッファ画像をスクリーンに描画する前後のバッファの切り替えを促す.プロトタイプは次のとおりです.
void glutSwapBuffers();
#ifdef __APPLE__

#include <GLUT/glut.h>

#else

#include <GL/glut.h>

#endif



void changeSize(int w, int h) {



    // Prevent a divide by zero, when window is too short

    // (you cant make a window of zero width).

    if (h == 0)

        h = 1;



    float ratio =  w * 1.0 / h;



    // Use the Projection Matrix

    glMatrixMode(GL_PROJECTION);



    // Reset Matrix

    glLoadIdentity();



    // Set the viewport to be the entire window

    glViewport(0, 0, w, h);



    // Set the correct perspective.

    gluPerspective(45.0f, ratio, 0.1f, 100.0f);



    // Get Back to the Modelview

    glMatrixMode(GL_MODELVIEW);

}



float angle = 0.0f;



void renderScene(void) {



    // Clear Color and Depth Buffers

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    // Reset transformations

    glLoadIdentity();

    // Set the camera

    gluLookAt(    0.0f, 0.0f, 10.0f,

                0.0f, 0.0f,  0.0f,

                0.0f, 1.0f,  0.0f);



    glRotatef(angle, 0.0f, 1.0f, 0.0f);



    glBegin(GL_TRIANGLES);

        glVertex3f(-2.0f,-2.0f, 0.0f);

        glVertex3f( 2.0f, 0.0f, 0.0);

        glVertex3f( 0.0f, 2.0f, 0.0);

    glEnd();



    angle+=0.1f;



    glutSwapBuffers();

}



int main(int argc, char **argv) {



    // init GLUT and create window

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(320,320);

    glutCreateWindow("Lighthouse3D- GLUT Tutorial");



    // register callbacks

    glutDisplayFunc(renderScene);

    glutReshapeFunc(changeSize);

    glutIdleFunc(renderScene);



    // enter GLUT event processing cycle

    glutMainLoop();



    return 1;

}