[訳]GLUTチュートリアル-アニメーション
10916 ワード
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation
前の章では、白い三角形のフォームを作成しました.まだクライマックスではありませんが、今からOpenGLアニメーションの楽しさを感じます.三角形を回転させます
まず、GLUTアプリケーションがアイドル時にレンダリング関数が呼び出されることを通知する.これによりGLUTは呼び出したレンダリング関数を保持するアニメーション効果を有効にすることができる.GLUTは、アプリケーションのアイドルイベントをバインドするためのコールバック関数を登録するための関数glutIdleFuncを提供します.
void glutIdleFunc(void (*func)(void));
func–アイドルイベントがトリガーする関数
以前の例では、アプリケーションが空いている場合に、前に定義したエンティティレンダリング関数:renderSceneを呼び出したいと考えていました.main関数のコードは次のとおりです.
次に、レンダリング関数の詳細について説明する.まず浮動小数点型値の角変数を宣言し、初期値は0.0である.次にrenderScene関数に必要な実装コードを追加する.
注意ここではデュアルバッファが必要です
私たちがmain関数でダブルバッファモードを表示モードとして設定したことを思い出してください.この特徴は、2種類の表示バッファを提供する.現在表示するのはフロントバッファであり、バックグラウンドバッファである.バックグラウンドバッファはバックグラウンドで設定に従って描画する.スイッチバッファの描画コマンドを送信と(例えば、駆動が完了すると前後のバッファが切り替わる)、次のフレームがスクリーンに置き換えるレンダリングされる.
glutSwapBuffers関数は、バックグラウンドに描かれたバッファ画像をスクリーンに描画する前後のバッファの切り替えを促す.プロトタイプは次のとおりです.
void glutSwapBuffers();
前の章では、白い三角形のフォームを作成しました.まだクライマックスではありませんが、今から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;
}