- 締切済み
OpenGLの惑星プログラム
/* p4-MovingPlanet.c * Animation for a solar system ( see p3-planet.c ) using by glutTimerFunc(). */ #include <stdlib.h> #include <GL/glut.h> #include <math.h> int year = 0, day = 0; int samplingTime = 50; void myKeyboard(unsigned char key, int x, int y) { if ( key == 27) exit (0); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0, 1.0, 1.0); glPushMatrix(); glutWireSphere(1.0, 20, 16); // sun glRotated((double)year, 0.0, 1.0, 0.0); glTranslated(3.0, 0.0, 0.0); glRotated((double)day, 0.0, 1.0, 0.0); glutWireSphere(0.2, 10, 8); // planet glPopMatrix(); glutSwapBuffers(); } void myInit(char *progname) { int width = 500, height = 500; glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(width, height); glutInitWindowPosition(0, 0); glutCreateWindow(progname); glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.0, (double)width / (double)height, 0.1, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void myTimer(int value) { if (value==1) { glutTimerFunc(samplingTime,myTimer,1); year = (year+1) % 360; day = (day+5) % 360; glutPostRedisplay(); } } int main(int argc, char** argv) { glutInit(&argc, argv); myInit(argv[0]); glutKeyboardFunc(myKeyboard); glutTimerFunc(samplingTime, myTimer, 1); glutDisplayFunc(myDisplay); glutMainLoop(); return 0; } このプログラムを改良して太陽系(水星~天王星)のプログラムを作成したいです。何を加えればいいんですか?教えてください><よろしくお願いします!!!
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- qwertfk
- ベストアンサー率67% (55/81)
// 現在の回転、移動設定を保存 glPushMatrix(); // 原点に半径1の円を描く(太陽) glutWireSphere(1.0, 20, 16);// sun // 次に描く惑星を (year)度 だけ回転(公転)させる glRotated((double)year, 0.0, 1.0, 0.0); // 次に描く惑星を原点からx方向に3移動 glTranslated(3.0, 0.0, 0.0); // 次に描く惑星を (day)度 だけ回転(自転)させる glRotated((double)day, 0.0, 1.0, 0.0); // 半径0.2の惑星を描く glutWireSphere(0.2, 10, 8);// planet // 現在の回転、移動設定を最後にglPushMatrixを実行した時の設定に戻す glPopMatrix(); これが各関数の意味です。 基本的には原点に太陽があり、各惑星に対し自転→太陽から一定距離離す→公転→描画 とすれば良いという課題のようですね。 あとは上記の処理の組み合わせを使って、各惑星に対し位置関係、半径、公転、自転等の条件を満たして表示していくだけで目的は達成できるのではないでしょうか。