最終更新:
mikk_ni3_92 2009年08月28日(金) 11:51:43履歴
現在地:メニュー >> NVIDIA_SDK >> NVIDIA_SDK_03 >> NVIDIA_SDK_03::まとめ
「nvTimer.h」「nvTimer.cpp」を用意、NVIDIA_SDK_02::まとめのプログラムを変更して、
「idle関数」でアニメーションさせ、
「idle関数」でアニメーションさせ、
- 「Framerate」:(フレームレートの事)
- 「FrameDuration」:(1フレームの開始から終了までにかかる時間の事)
#include <iostream> #include <string> #include <GL/glut.h> #include <nvGlutManipulators.h> #include <nvTime.h> //------- 各種外部変数 --------// nv::GlutExamine manipulator; //マウス操作用マニピュレータ nv::FrameTimer g_FrameTimer; //フレームタイマー //------------- プロトタイプ宣言 ------------------// void display(); void reshape(int w, int h); void myMouseFunc(int button,int state,int x,int y); void myMouseMotion(int x,int y); void idle(void); void DRAW_XYZ(); //------------- OpenGLの初期設定 -------------------------// void GLUT_CALL_FUNCs() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(myMouseFunc); glutMotionFunc(myMouseMotion); glutIdleFunc(idle); } void OtherMyInit() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING);//光源の有効化 glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE);//拡大縮小処理に対し、法線は正規化する } void GLUT_INITs(int *argcp, char **argv) { glutInit(argcp,argv); glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("NVIDIA SDK nvTimer Sample"); GLUT_CALL_FUNCs(); OtherMyInit(); } //----------- メイン関数 -----------------// int main(int argc, char **argv) { GLUT_INITs(&argc,argv); manipulator.setTrackballScale(2.0);//トラックボール(回転処理の速度) manipulator.setDollyActivate( GLUT_LEFT_BUTTON, GLUT_ACTIVE_CTRL);//左ドラッグ+ctl → dolly移動処理 manipulator.setPanActivate( GLUT_LEFT_BUTTON, GLUT_ACTIVE_SHIFT);//左ドラッグ+Shfit → pan移動処理 g_FrameTimer.start(); glutMainLoop(); g_FrameTimer.stop(); return 0; } //------------- ここから各種コールバック -----------------// void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); manipulator.applyTransform();//移動を適用する(回転、平行、拡大縮小など) static float Light0Pos[]={-3,4,5,0}; //光源の位置 glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置だけ設定(あとはデフォルト) glColor3f(0,1,0); glutSolidTeapot(1); DRAW_XYZ(); glutSwapBuffers(); g_FrameTimer.newFrame();//新しいフレームである事を通知(「1フレーム数+1」などをしている) std::cout << std::string("[Framerate] = ") << ( g_FrameTimer.getFramerate()) << std::string(" [FrameDuration]= ") << (g_FrameTimer.getFrameDuration() * 1000) << std::string(" ms") << "\r"; } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); manipulator.reshape(w, h); } void myMouseFunc(int button,int state,int x,int y) { manipulator.mouse(button, state, x, y); } void myMouseMotion(int x,int y) { manipulator.motion(x, y); } void idle(void) { glutPostRedisplay(); } //------------ ここから各種関数 ---------------// void DRAW_XYZ() { glDisable(GL_LIGHTING);//光源の有効化 glDisable(GL_LIGHT0); glBegin(GL_LINES); glColor3f(0,1,0);//x glVertex2f(-100,0); glVertex2f(100, 0); glColor3f(1,0,0);//y glVertex2f(0,0); glVertex2f(0,100); glColor3f(0,0,1);//z glVertex3f(0,0,-100); glVertex3f(0,0, 100); glEnd(); glEnable(GL_LIGHTING);//光源の有効化 glEnable(GL_LIGHT0); }