#include #include void display(void) { static float theta_ek; static float theta_mk; static float theta_e; theta_mk+=3.0; theta_ek+=1.0; theta_e+=5.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0, 100.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glColor3f(1.0, 0.0, 0.0); glutSolidSphere(20.0, 36, 18);/* 太陽 */ glPushMatrix();/* ワールド座標系の行列をスタックに入れる */ { glRotatef(theta_ek, 0.0, 0.0, 1.0);/* z軸周りにtheta_ek度回転 */ glTranslatef(60.0, 0.0, 0.0);/* x軸に60平行移動 */ glColor3f(0.0, 0.0, 1.0); glutSolidSphere(10.0, 36, 18);/* 地球 */ glPushMatrix();/* 地球座標系の行列をスタックに入れる */ { glRotatef(theta_mk, 0.0, 0.0, 1.0);/* z軸周りにtheta_mk度回転 */ glTranslatef(20.0, 0.0, 0.0);/* x軸に20平行移動 */ glColor3f(1.0, 1.0, 0.0); glutSolidSphere(5.0, 36, 18);/* 月 */ } glPopMatrix();/* 地球座標系の行列を取り出す */ } glPopMatrix();/* ワールド座標系の行列を取り出す */ glFlush(); glutSwapBuffers(); } void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); /*黒で画面クリア*/ glShadeModel (GL_SMOOTH); /*フラットシェーディング*/ glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glEnable(GL_DEPTH_TEST); } void reshape(int w, int h) /*画面サイズ変更時に呼ばれる*/ { glViewport(0, 0, (GLsizei) w, (GLsizei) h); /*画面の出る範囲*/ glMatrixMode(GL_PROJECTION); /*視界変換宣言*/ glLoadIdentity(); /*単位行列代入*/ glFrustum(-50.0, 50.0, -50.0, 50.0, 30.0, 10000.0);/*視体積の設定*/ glMatrixMode(GL_MODELVIEW); /*モデル変換宣言*/ glLoadIdentity(); /*単位行列代入*/ } int main(int argc, char** argv) { glutInit(&argc, argv); /*GLUT初期化*/ glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize (500, 500); /*画面の大きさ設定*/ glutInitWindowPosition (100, 100); /*画面の位置設定*/ glutCreateWindow (argv[0]); /*引数の名前のウインドウ作成*/ init (); glutIdleFunc(display); /*アイドル時に呼ぶ関数*/ glutDisplayFunc(display); /*表示時に呼ぶ関数*/ glutReshapeFunc(reshape); /*画面サイズ変更時に呼ぶ関数*/ glutMainLoop(); /*描画開始*/ return 0; }