// -------------------------------------------------------------------- // gls02.cとgls10.cを組み合わせて // 太陽系をある程度再現したプログラム // -------------------------------------------------------------------- /* ヘッダファイル */ #include #include #include #include #include #include #define _USE_MATH_DEFINES #include #include"jpegio.h" #define RAD (M_PI / 180.0) // グローバル変数 int xBegin = 0; //マウスドラッグの始点X座標 int yBegin = 0; // マウスドラッグの始点Y座標 int PressButton = 0; // 現在押されているマウスボタン(1:左,2:中,3:右) float CameraAzimuth = 90.0; // カメラの位置(方位角 float CameraElevation = 0.0; // カメラの位置(仰角 float CameraDistance = 1000.0; // カメラの位置(原点からの距離 float CameraX = 0.0; // カメラの位置(X座標) float CameraY = 0.0; // カメラの位置(Y座標) float CameraZ = 1000.0; // カメラの位置(Z座標) int WIDTH,HEIGHT; //テクスチャ関連の変数 #define NUM_TEXTURES 11 //太水金地火木土天海 GLuint texture[NUM_TEXTURES]; // テクスチャを識別する変数 int CurrentTexture = 0; // 表示するテクスチャ番号 GLUquadricObj *sphere; //gluSphereでテクスチャをはるためのオブジェクト //glutSolidSphereだと球にテクスチャが張れない?? //各星のデータ(wikipediaより) //_R:直径 //_C:公転周期(年) //_D:太陽からの距離(km) #define SUN_R 1392000 #define MERCURY_R 4879.4 #define MERCURY_C 0.241 #define MERCURY_D 0.38710 #define VENUS_R 12103.6 #define VENUS_C 0.615 #define VENUS_D 0.72333 #define EARTH_R 12756.3 #define EARTH_C 1.00 #define EARTH_D 1.000 #define MARS_R 6794.4 #define MARS_C 1.881 #define MARS_D 1.52366 #define JUPITER_R 142984 #define JUPITER_C 11.86 #define JUPITER_D 5.20336 #define SATURN_R 120536 #define SATURN_C 29.46 #define SATURN_D 9.53707 #define URANUS_R 51118 #define URANUS_C 84.01 #define URANUS_D 19.19138 #define NEPTUNE_R 49572 #define NEPTUNE_C 164.79 #define NEPTUNE_D 30.06896 //軌道傾斜角(度 #define MERCURY_INCLINATION 7.0 #define VENUS_INCLINATION 3.39 #define EARTH_INCLINATION 0.0 #define MARS_INCLINATION 1.85 #define JUPITER_INCLINATION 1.3 #define SATURN_INCLINATION 2.49 #define URANUS_INCLINATION 0.77 #define NEPTUNE_INCLINATION 1.77 //赤道傾斜角(度 #define MERCURY_INCLINATION_O 0.0 #define VENUS_INCLINATION_O 178 #define EARTH_INCLINATION_O 23.4 #define MARS_INCLINATION_O 25 #define JUPITER_INCLINATION_O 3.08 #define SATURN_INCLINATION_O 26.7 #define URANUS_INCLINATION_O 97.9 #define NEPTUNE_INCLINATION_O 29.6 #define AU 149597870 //天文単位(km) #define D_SCALE 0.0000001 //距離のスケーリング #define R_SCALE 0.00001 //半径のスケーリング //太陽からの距離に対して星の描画は100倍大きく描画 //各天体のスケール(上のR_SCALE,D_SCALEだけだと見た目の調整が難しいから) #define SUN_SCALE 0.5 //太陽は50倍(100x0.5)のサイズで描画 #define MERCURY_SCALE 20 //その他の星は2000倍(100x20)のサイズで描画 #define VENUS_SCALE 20 #define EARTH_SCALE 20 #define MARS_SCALE 20 #define JUPITER_SCALE 20 #define SATURN_SCALE 20 #define URANUS_SCALE 20 #define NEPTUNE_SCALE 20 //星の位置 float SunPos[3]; float MercuryPos[3]; float VenusPos[3]; float EarthPos[3]; float MarsPos[3]; float JupiterPos[3]; float SaturnPos[3]; float UranusPos[3]; float NeptunePos[3]; //軌道をline_loopで結ぶための点を格納する. //orbitInitで先に計算しとく float SunOrbit[3][360]; float MercuryOrbit[3][360]; float VenusOrbit[3][360]; float EarthOrbit[3][360]; float MarsOrbit[3][360]; float JupiterOrbit[3][360]; float SaturnOrbit[3][360]; float UranusOrbit[3][360]; float NeptuneOrbit[3][360]; float BoxRotate; //星の位置(角度) float SunRotate, MercuryRotate, VenusRotate, EarthRotate, MarsRotate; float JupiterRotate, SaturnRotate, UranusRotate, NeptuneRotate; int MoonRotate = 0; // 関数のプロトタイプ宣言 void display(void); void timer(int timerID); void keyboard(unsigned char key, int x, int y ); void mouseButton(int button, int state, int x, int y ); void mouseDrag(int x, int y); void myInit (char *windowTitle); void orbitInit(); //軌道の計算と初期位置の決定 void SetupTextures(); //星のテクスチャを読み込む関数 //土星のリングの位置 float SaturnInnerRingPos[3][360]; float SaturnOuterRingPos[3][360]; //月 float MoonPos[3][360]; /*********************************************************** | 関数:main() | 説明:メイン関数 | 引数:int argc 実行時引数の数 | 引数:char** argv 実行時引数の内容(文字列配列) | 戻値:int 0:正常終了 ***********************************************************/ int main(int argc, char** argv) { /* 初期化 */ glutInit(&argc, argv); /* OpenGL の初期化 */ myInit(argv[0]); /* ウインドウ表示と描画設定の初期化 */ /* イベント処理ループ */ glutMainLoop(); /* プログラム終了 */ return( 0 ); } /********************************************************** | 関数:display() | 説明:「1枚の」グラフィック描画イベント処理 | 引数:なし | 戻値:なし ***********************************************************/ void display(void) { int i; /* 初期化 */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 画面を消去 */ glMatrixMode(GL_MODELVIEW); /* 幾何(描画位置など設定する)モード */ glLoadIdentity(); /* 幾何を初期化する */ /* 視点の設定 */ gluLookAt( CameraX, CameraY, CameraZ, /* カメラの位置 */ 0.0, 0.0, 0.0, /* 注視点の位置 */ 0.0, 1.0, 0.0); /* カメラ上方向のベクトル */ //軌道の描画 glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(MercuryOrbit[0][i],MercuryOrbit[1][i],MercuryOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(VenusOrbit[0][i],VenusOrbit[1][i],VenusOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(EarthOrbit[0][i],EarthOrbit[1][i],EarthOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(MarsOrbit[0][i],MarsOrbit[1][i],MarsOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(JupiterOrbit[0][i],JupiterOrbit[1][i],JupiterOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(SaturnOrbit[0][i],SaturnOrbit[1][i],SaturnOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(UranusOrbit[0][i],UranusOrbit[1][i],UranusOrbit[2][i]); } glEnd(); glBegin(GL_LINE_LOOP); for(i=0;i<360;i++){ glVertex3f(NeptuneOrbit[0][i],NeptuneOrbit[1][i],NeptuneOrbit[2][i]); } glEnd(); ////////////星の描画 float color[4] = {1.0, 1.0, 1.0, 1.0}; /* Sun 描画*/ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[0]); /* 使用するテクスチャを撰択 */ gluSphere(sphere,(SUN_R/2)*R_SCALE*SUN_SCALE,32,32); //glutSolidSphereだとうまく貼り付けれない? //glutSolidSphere((SUN_R/2)*R_SCALE*SUN_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* 描画位置を戻す */ /* Mercury */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[1]); /* 使用するテクスチャを撰択 */ glTranslatef(MercuryPos[0],MercuryPos[1],MercuryPos[2]); glRotatef(MERCURY_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(MERCURY_R/2)*R_SCALE*MERCURY_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Venus */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[2]); /* 使用するテクスチャを撰択 */ glTranslatef(VenusPos[0],VenusPos[1],VenusPos[2]); /* 描画位置をX方向に1.0移動 */ glRotatef(VENUS_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(VENUS_R/2)*R_SCALE*VENUS_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Earth */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[3]); /* 使用するテクスチャを撰択 */ glTranslatef(EarthPos[0],EarthPos[1],EarthPos[2]); glRotatef(EARTH_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(EARTH_R/2)*R_SCALE*EARTH_SCALE,32,32); glDisable(GL_TEXTURE_2D); glTranslatef(MoonPos[0][MoonRotate],MoonPos[1][MoonRotate],MoonPos[2][MoonRotate]); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[10]); /* 使用するテクスチャを撰択 */ gluSphere(sphere,0.2*(EARTH_R/2)*R_SCALE*EARTH_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Mars */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[4]); /* 使用するテクスチャを撰択 */ glTranslatef(MarsPos[0],MarsPos[1],MarsPos[2]); glRotatef(MARS_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(MARS_R/2)*R_SCALE*MARS_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Jupiter */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[5]); /* 使用するテクスチャを撰択 */ glTranslatef(JupiterPos[0],JupiterPos[1],JupiterPos[2]); glRotatef(JUPITER_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(JUPITER_R/2)*R_SCALE*JUPITER_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Saturn */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[6]); /* 使用するテクスチャを撰択 */ glTranslatef(SaturnPos[0],SaturnPos[1],SaturnPos[2]); glRotatef(SATURN_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(SATURN_R/2)*R_SCALE*SATURN_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); //Saturnのリング描画 glColor3f(0.4, 0.4, 0.4); glBegin(GL_TRIANGLE_STRIP); for(i=0;i<360;i++){ glVertex3f(SaturnPos[0]+SaturnOuterRingPos[0][i], SaturnPos[1]+SaturnOuterRingPos[1][i], SaturnPos[2]+SaturnOuterRingPos[2][i]); glVertex3f(SaturnPos[0]+SaturnInnerRingPos[0][i], SaturnPos[1]+SaturnInnerRingPos[1][i], SaturnPos[2]+SaturnInnerRingPos[2][i]); } glVertex3f(SaturnPos[0]+SaturnOuterRingPos[0][0], SaturnPos[1]+SaturnOuterRingPos[1][0], SaturnPos[2]+SaturnOuterRingPos[2][0]); glVertex3f(SaturnPos[0]+SaturnInnerRingPos[0][0], SaturnPos[1]+SaturnInnerRingPos[1][0], SaturnPos[2]+SaturnInnerRingPos[2][0]); glEnd(); /* Uranus */ glColor3f(1.0, 1.0, 1.0); glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[7]); /* 使用するテクスチャを撰択 */ glTranslatef(UranusPos[0],UranusPos[1],UranusPos[2]); glRotatef(URANUS_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(URANUS_R/2)*R_SCALE*URANUS_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* Neptune */ glPushMatrix (); /* 描画位置を保存 */ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[8]); /* 使用するテクスチャを撰択 */ glTranslatef(NeptunePos[0],NeptunePos[1],NeptunePos[2]); glRotatef(NEPTUNE_INCLINATION_O, 1.0, 0.0, 0.0); glRotatef(BoxRotate, 0.0, 0.0, -1.0); gluSphere(sphere,(NEPTUNE_R/2)*R_SCALE*NEPTUNE_SCALE,32,32); glDisable(GL_TEXTURE_2D); glPopMatrix (); /* 描画位置を戻す */ //背景の宇宙を描画 //全体を包む立方体に星空の画像をマッピング glMaterialfv(GL_FRONT, GL_DIFFUSE, color); /* 描画色を設定 */ glNormal3f(0, 0, 1.0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); //各頂点と共にテクスチャ座標(0.0〜1.0)を設定 glTexCoord2d(0.0, 0.0); glVertex3f(-2000,2000,-2000);//1枚目 glTexCoord2d(0.0, 1.0); glVertex3f(-2000,-2000,-2000); glTexCoord2d(1.0, 1.0); glVertex3f(2000,-2000,-2000); glTexCoord2d(1.0, 0.0); glVertex3f(2000,2000,-2000); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex3f(-2000,2000,2000);//2枚目 glTexCoord2d(0.0, 1.0); glVertex3f(-2000,-2000,2000); glTexCoord2d(1.0, 1.0); glVertex3f(2000,-2000,2000); glTexCoord2d(1.0, 0.0); glVertex3f(2000,2000,2000); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex3f(-2000,-2000,2000);//3枚目 glTexCoord2d(0.0, 1.0); glVertex3f(-2000,-2000,-2000); glTexCoord2d(1.0, 1.0); glVertex3f(-2000,2000,-2000); glTexCoord2d(1.0, 0.0); glVertex3f(-2000,2000,2000); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex3f(2000,-2000,2000);//4枚目 glTexCoord2d(0.0, 1.0); glVertex3f(2000,-2000,-2000); glTexCoord2d(1.0, 1.0); glVertex3f(2000,2000,-2000); glTexCoord2d(1.0, 0.0); glVertex3f(2000,2000,2000); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex3f(2000,-2000,-2000);//5枚目 glTexCoord2d(0.0, 1.0); glVertex3f(-2000,-2000,-2000); glTexCoord2d(1.0, 1.0); glVertex3f(-2000,-2000,2000); glTexCoord2d(1.0, 0.0); glVertex3f(2000,-2000,2000); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[9]); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex3f(2000,2000,-2000);//6枚目 glTexCoord2d(0.0, 1.0); glVertex3f(-2000,2000,-2000); glTexCoord2d(1.0, 1.0); glVertex3f(-2000,2000,2000); glTexCoord2d(1.0, 0.0); glVertex3f(2000,2000,2000); glEnd(); glDisable(GL_TEXTURE_2D); /* 上記で描画されたCGをモニターに出力 */ glutSwapBuffers(); } /*********************************************************** | 関数:timer(int timerID) | 説明:タイマー(設定時間経過)イベント処理 | 引数:int timerID イベントが発生したタイマーの識別ID | 戻値:なし ***********************************************************/ void timer(int timerID) { float step = 1.0; /* 次のタイマーを15ミリ秒後に設定 */ glutTimerFunc(15, timer, 0); /* オブジェクトの回転角度を1.0度ずつ増加させる */ BoxRotate += step; SunRotate += step; MercuryRotate += (1/MERCURY_C)*step; VenusRotate += (1/VENUS_C)*step; EarthRotate += (1/EARTH_C)*step; MarsRotate += (1/MARS_C)*step; JupiterRotate += (1/JUPITER_C)*step; SaturnRotate += (1/SATURN_C)*step; UranusRotate += (1/URANUS_C)*step; NeptuneRotate += (1/NEPTUNE_C)*step; MoonRotate++; if( BoxRotate > 360.0 ) BoxRotate -= 360.0; if( SunRotate > 360.0 ) SunRotate -= 360.0; if( MercuryRotate > 360.0 ) MercuryRotate -= 360.0; if( VenusRotate > 360.0 ) VenusRotate -= 360.0; if( EarthRotate > 360.0 ) EarthRotate -= 360.0; if( MarsRotate > 360.0 ) MarsRotate -= 360.0; if( JupiterRotate > 360.0 ) JupiterRotate -= 360.0; if( SaturnRotate > 360.0 ) SaturnRotate -= 360.0; if( UranusRotate > 360.0 ) UranusRotate -= 360.0; if( NeptuneRotate > 360.0 ) NeptuneRotate -= 360.0; if( MoonRotate > 360 ) MoonRotate -= 360; MercuryPos[0] = MERCURY_D*AU*D_SCALE*cos(MercuryRotate * RAD); MercuryPos[1] = MERCURY_D*AU*D_SCALE*sin(MercuryRotate * RAD); MercuryPos[2] = MercuryPos[1] * sin(MERCURY_INCLINATION * RAD); VenusPos[0] = VENUS_D*AU*D_SCALE*cos(VenusRotate * RAD); VenusPos[1] = VENUS_D*AU*D_SCALE*sin(VenusRotate * RAD); VenusPos[2] = VenusPos[1] * sin(VENUS_INCLINATION * RAD); EarthPos[0] = EARTH_D*AU*D_SCALE*cos(EarthRotate * RAD); EarthPos[1] = EARTH_D*AU*D_SCALE*sin(EarthRotate * RAD); EarthPos[2] = EarthPos[1] * sin(EARTH_INCLINATION * RAD); MarsPos[0] = MARS_D*AU*D_SCALE*cos(MarsRotate * RAD); MarsPos[1] = MARS_D*AU*D_SCALE*sin(MarsRotate * RAD); MarsPos[2] = MarsPos[1] * sin(MARS_INCLINATION * RAD); JupiterPos[0] = JUPITER_D*AU*D_SCALE*cos(JupiterRotate * RAD); JupiterPos[1] = JUPITER_D*AU*D_SCALE*sin(JupiterRotate * RAD); JupiterPos[2] = JupiterPos[1] * sin(JUPITER_INCLINATION * RAD); SaturnPos[0] = SATURN_D*AU*D_SCALE*cos(SaturnRotate * RAD); SaturnPos[1] = SATURN_D*AU*D_SCALE*sin(SaturnRotate * RAD); SaturnPos[2] = SaturnPos[1] * sin(SATURN_INCLINATION * RAD); UranusPos[0] = URANUS_D*AU*D_SCALE*cos(UranusRotate * RAD); UranusPos[1] = URANUS_D*AU*D_SCALE*sin(UranusRotate * RAD); UranusPos[2] = UranusPos[1] * sin(URANUS_INCLINATION * RAD); NeptunePos[0] = NEPTUNE_D*AU*D_SCALE*cos(NeptuneRotate * RAD); NeptunePos[1] = NEPTUNE_D*AU*D_SCALE*sin(NeptuneRotate * RAD); NeptunePos[2] = NeptunePos[1] * sin(NEPTUNE_INCLINATION * RAD); /* 描画要求(直後に display() 関数が呼ばれる) */ glutPostRedisplay(); } /*********************************************************** | 関数:keyboard() | 説明:キーボードが押された時のイベント処理 | 引数:unsigned char key 押されたキーの文字コード | 引数:int x キーが押されたときのマウスポインタのX座標 | 引数:int y キーが押されたときのマウスポインタのY座標 | 戻値:なし ***********************************************************/ void keyboard(unsigned char key, int x, int y ) { /* キーボード処理 */ switch( key ) { case 'q': exit( 0 ); /* プログラム終了 */ break; } /* 描画要求(直後に display() 関数が呼ばれる) */ glutPostRedisplay(); /* コンパイル時の警告対策(定義された変数を使わないと警告になるので) */ x = y = 0; } /*********************************************************** | 関数:mouseButton() | 説明:マウスのボタン操作時のイベント処理 | 引数:int button 操作したマウスボタンの番号 | 引数:int state 操作の種類 GLUT_DOWN(押す)かGLUT_UP(離す) | 引数:int x キーが押されたときのマウスポインタのX座標 | 引数:int y キーが押されたときのマウスポインタのY座標 | 戻値:なし ***********************************************************/ void mouseButton(int button, int state, int x, int y ) { /* マウスが押された時 */ if (state == GLUT_DOWN) { switch(button) { case GLUT_LEFT_BUTTON: /* マウス左ボタンを押した時の処理 */ PressButton = button; break; case GLUT_MIDDLE_BUTTON:/* マウス中ボタンを押した時の処理 */ break; case GLUT_RIGHT_BUTTON: /* マウス右ボタンを押した時の処理 */ PressButton = button; break; } /* マウスボタンを押した瞬間の始点座標を記録する */ xBegin = x; yBegin = y; } } /*********************************************************** | 関数:mouseDrag() | 説明:画面上でマウスがドラッグされた時のイベント処理 | 引数:int x 現在のマウスポインタのX座標 | 引数:int y 現在のマウスポインタのY座標 | 戻値:なし ***********************************************************/ void mouseDrag(int x, int y) { /* マウスボタンが押されてからの移動量を計算する */ int xMove = x - xBegin; int yMove = y - yBegin; switch (PressButton) { /* マウス左ボタンドラッグ時の処理 */ /* 視点を方位角,仰角に対して回転させる */ case GLUT_LEFT_BUTTON: CameraAzimuth += (float)xMove / 2.0; CameraElevation += (float)yMove / 2.0; if (CameraElevation > 90.0) CameraElevation = 90.0; if (CameraElevation < -90.0) CameraElevation = -90.0; break; /* マウス右ボタンドラッグ時の処理 */ /* 視点を奥行き方向に前後に移動させる */ case GLUT_RIGHT_BUTTON: CameraDistance += (float)yMove / 2.0; break; } CameraX = CameraDistance * cos(CameraAzimuth * RAD) * cos(CameraElevation * RAD); CameraY = CameraDistance * sin(CameraElevation * RAD); CameraZ = CameraDistance * sin(CameraAzimuth * RAD) * cos(CameraElevation * RAD); //printf("Camera AZ:%.1f, EL:%.1f, dist:%.1f, x,y,z= %.1f, %.1f, %.1f\n", // CameraAzimuth, CameraElevation, CameraDistance, CameraX, CameraY, CameraZ); /* 現在のマウスポインタの座標を次の始点用に記録する */ xBegin = x; yBegin = y; /* 描画要求(直後に display() 関数が呼ばれる) */ glutPostRedisplay(); } /*********************************************************** | 関数:myInit() | 説明:ウインドウ表示と描画設定の初期化 | 引数:char *windowTitle ウインドウのタイトルバーに表示する文字列 | 戻値:なし ***********************************************************/ void myInit (char *windowTitle) { /* ウインドウのサイズ */ int winWidth = 400; int winHeight = 400; /* ウインドウの縦横の比を計算 */ float aspect = (float)winWidth / (float)winHeight; /* OpenGLウインドウ作成までの初期化 */ glutInitWindowPosition(0, 0); /* ウインドウ表示位置 */ glutInitWindowSize(winWidth, winHeight); /* ウインドウサイズ */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); /* 描画モード */ glutCreateWindow(windowTitle); /* ウインドウの表示 */ glClearColor (0.0, 0.0, 0.0, 1.0); /* 画面消去色の設定 */ /* イベント発生時に呼び出す関数の登録 */ glutKeyboardFunc(keyboard); /* キーボードを押した時 */ glutMouseFunc (mouseButton); /* マウスボタンを押した時*/ glutMotionFunc (mouseDrag); /* マウスドラッグした時 */ glutDisplayFunc (display); /* 画面表示 */ glutTimerFunc(15, timer, 0); /* タイマーを15ミリ秒後に設定 */ /* CG描画設定 */ glMatrixMode(GL_PROJECTION); /* 透視投影(遠近投影法)設定モードに切り替え */ glLoadIdentity(); /* 透視投影行列を初期化 */ gluPerspective(45.0, aspect, 1.0, 400000.0); /* 透視投影行列の設定 */ /* 視野角45度, 縦横比 aspect,描画前面までの奥行 1.0,描画背面までの奥行 20.0 */ glEnable(GL_DEPTH_TEST); /* 隠面消去を有効にする */ //球オブジェクトの生成 sphere = gluNewQuadric(); //オブジェクト生成 gluQuadricDrawStyle(sphere, GLU_FILL); // 描画スタイルの設定 gluQuadricTexture(sphere, GL_TRUE); orbitInit(); SetupTextures();//テクスチャの生成 } //初期位置と軌道等の値を事前計算する関数 void orbitInit() { int i; //初期位置設定 SunRotate = (float)(rand()%360); MercuryRotate = (float)(rand()%360); VenusRotate = (float)(rand()%360); EarthRotate = (float)(rand()%360); MarsRotate = (float)(rand()%360); JupiterRotate = 0; SaturnRotate = (float)(rand()%360); UranusRotate = (float)(rand()%360); NeptuneRotate = (float)(rand()%360); for(i=0;i<360;i++){ MercuryOrbit[0][i] = MERCURY_D*AU*D_SCALE*cos(i * RAD); MercuryOrbit[1][i] = MERCURY_D*AU*D_SCALE*sin(i * RAD); MercuryOrbit[2][i] = MercuryOrbit[1][i] * sin(MERCURY_INCLINATION * RAD); VenusOrbit[0][i] = VENUS_D*AU*D_SCALE*cos(i * RAD); VenusOrbit[1][i] = VENUS_D*AU*D_SCALE*sin(i * RAD); VenusOrbit[2][i] = VenusOrbit[1][i] * sin(VENUS_INCLINATION * RAD); EarthOrbit[0][i] = EARTH_D*AU*D_SCALE*cos(i * RAD); EarthOrbit[1][i] = EARTH_D*AU*D_SCALE*sin(i * RAD); EarthOrbit[2][i] = EarthOrbit[1][i] * sin(EARTH_INCLINATION * RAD); MarsOrbit[0][i] = MARS_D*AU*D_SCALE*cos(i * RAD); MarsOrbit[1][i] = MARS_D*AU*D_SCALE*sin(i * RAD); MarsOrbit[2][i] = MarsOrbit[1][i] * sin(MARS_INCLINATION * RAD); JupiterOrbit[0][i] = JUPITER_D*AU*D_SCALE*cos(i * RAD); JupiterOrbit[1][i] = JUPITER_D*AU*D_SCALE*sin(i * RAD); JupiterOrbit[2][i] = JupiterOrbit[1][i] * sin(JUPITER_INCLINATION * RAD); SaturnOrbit[0][i] = SATURN_D*AU*D_SCALE*cos(i * RAD); SaturnOrbit[1][i] = SATURN_D*AU*D_SCALE*sin(i * RAD); SaturnOrbit[2][i] = SaturnOrbit[1][i] * sin(SATURN_INCLINATION * RAD); UranusOrbit[0][i] = URANUS_D*AU*D_SCALE*cos(i * RAD); UranusOrbit[1][i] = URANUS_D*AU*D_SCALE*sin(i * RAD); UranusOrbit[2][i] = UranusOrbit[1][i] * sin(URANUS_INCLINATION * RAD); NeptuneOrbit[0][i] = NEPTUNE_D*AU*D_SCALE*cos(i * RAD); NeptuneOrbit[1][i] = NEPTUNE_D*AU*D_SCALE*sin(i * RAD); NeptuneOrbit[2][i] = NeptuneOrbit[1][i] * sin(NEPTUNE_INCLINATION * RAD); SaturnOuterRingPos[0][i] = (SATURN_R)*R_SCALE*SATURN_SCALE * cos(i * RAD); SaturnOuterRingPos[1][i] = (SATURN_R)*R_SCALE*SATURN_SCALE * sin(i * RAD);; SaturnOuterRingPos[2][i] = SaturnOuterRingPos[1][i] * sin(SATURN_INCLINATION_O * RAD); SaturnInnerRingPos[0][i] = 0.7*(SATURN_R)*R_SCALE*SATURN_SCALE * cos(i * RAD); SaturnInnerRingPos[1][i] = 0.7*(SATURN_R)*R_SCALE*SATURN_SCALE * sin(i * RAD);; SaturnInnerRingPos[2][i] = SaturnInnerRingPos[1][i] * sin(SATURN_INCLINATION_O * RAD); MoonPos[0][i] = (EARTH_R)*R_SCALE*EARTH_SCALE * cos(-5*i * RAD); MoonPos[1][i] = (EARTH_R)*R_SCALE*EARTH_SCALE * sin(-5*i * RAD);; MoonPos[2][i] = MoonPos[1][i] * sin(EARTH_INCLINATION_O * RAD); } } void SetupTextures() { //とりあえず今回はopencvを使う. //追記 jpegライブラリに変更opencv部分はコメント int i; int x,y; int pos; char *filename[NUM_TEXTURES] = {"sun.jpg", "mercury.jpg", "venus.jpg", "earth3.jpg", "mars.jpg", "jupiter.jpg", "saturn.jpg", "uranus.jpg", "neptune.jpg", "space.jpg", "moon.jpg"}; int width = 0; int height = 0; unsigned char *imageData = NULL; glGenTextures(NUM_TEXTURES, texture); for (i = 0; i < NUM_TEXTURES; i++) { // 画像情報の取得 width = readHeader(filename[i], IMAGE_WIDTH); height = readHeader(filename[i], IMAGE_HEIGHT); if (readJpeg(filename[i], &imageData) == 0) exit(1); // テクスチャ作成 glBindTexture(GL_TEXTURE_2D, texture[i]); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData); // 画像データ領域の解放 free (imageData); } }