最終更新: mikk_ni3_92 2009年10月19日(月) 11:46:11履歴
現在地: メニュー >> 実践編13 >> 実践編13::まとめコード1
#include <GL/glut.h> //---------- プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void mouse(int button, int state, int x, int y); void dragMotion(int x , int y); void idle(); double xmove,ymove; int spinMode = 0; //マウスの状態 struct MOUSE { int Xstart,Ystart; bool flag; double weight; }; MOUSE MouseStatus={0,0,false,0.1}; //重み付け //回転関係 struct ObjectRotate { double xAngle,yAngle; }; ObjectRotate ObjRot={0,0}; //デフォルトは(0,0) //------------ OpenGLの初期化 ------------------// void GLUT_CALL_FUNCs() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); //マウスのクリック glutMotionFunc(dragMotion); //ドラッグ処理 } void mouse(int button, int state, int x, int y) { if(button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) { spinMode = 0; glutIdleFunc(NULL); MouseStatus.Xstart = x; //クリック位置を記憶 MouseStatus.Ystart = y; MouseStatus.flag = true; }else { MouseStatus.flag =false; } } void dragMotion(int x , int y) { //左ドラッグ時 if(MouseStatus.flag == true) { static int xdir,ydir; xdir = x - MouseStatus.Xstart; //ドラッグ操作での移動量を取得 ydir = y - MouseStatus.Ystart; xmove = (double)ydir * MouseStatus.weight; ymove = (double)xdir * MouseStatus.weight; MouseStatus.Xstart = x; //今の位置を基準に変更 MouseStatus.Ystart = y; spinMode = 1; glutIdleFunc(idle); } } void OtherMyInit() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); } void GLUT_INITs(int *argcp, char **argv) { glutInit(argcp,argv); glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("spin Animation 1"); GLUT_CALL_FUNCs(); OtherMyInit(); } //--------- メイン関数 ----------------// int main(int argc, char **argv) { GLUT_INITs(&argc,argv); glutMainLoop(); 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); glEnable(GL_LIGHTING);//光源の有効化 glEnable(GL_LIGHT0); static float Light0Pos[]={-1,1,1,0}; //光源の位置 glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置だけ設定(あとはデフォルト) glRotated(ObjRot.xAngle,1,0,0); glRotated(ObjRot.yAngle,0,1,0); glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glColor3f(0,1,0); glutSolidTeapot(1); glutSwapBuffers(); } 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); } void idle(void) { //ここで移動量加算 ObjRot.xAngle +=xmove; ObjRot.yAngle += ymove; //オーバー、アンダーフロー対策 if(ObjRot.xAngle > 360) { ObjRot.xAngle = ObjRot.xAngle - 360; }else if(ObjRot.xAngle < 0) { ObjRot.xAngle = 360 - ObjRot.xAngle ; } if(ObjRot.yAngle > 360) { ObjRot.yAngle = ObjRot.yAngle - 360; }else if(ObjRot.yAngle < 0) { ObjRot.yAngle = 360 - ObjRot.yAngle ; } glutPostRedisplay(); }