dポイントプレゼントキャンペーン実施中!

/* 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;

}

このプログラムを改良して太陽系(水星~天王星)のプログラムを作成したいです。何を加えればいいんですか?教えてください><よろしくお願いします!!!

A 回答 (1件)

// 現在の回転、移動設定を保存


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();


これが各関数の意味です。

基本的には原点に太陽があり、各惑星に対し自転→太陽から一定距離離す→公転→描画
とすれば良いという課題のようですね。

あとは上記の処理の組み合わせを使って、各惑星に対し位置関係、半径、公転、自転等の条件を満たして表示していくだけで目的は達成できるのではないでしょうか。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!