ここから本文です

OpenGLについての質問です。惑星軌道のプログラムです。

ニャンちゅうさん

2014/5/1611:29:08

OpenGLについての質問です。惑星軌道のプログラムです。

惑星軌道のプログラムで、急須を真ん中の太陽に楕円軌道させて、太陽、地球、月をスムーズシェーディングさせたいのですが、関数の追加の方法がいまいちよく分かりません。太陽の裏側になったときに、見えなくなるようにするにはどうしたらよいですか?マウスのドラッグで視点を移動させるにはどうしたらいいですか?
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>

int year = 0, day = 0;
int samplingTime = 50;
double theta = 0.0;

void myKeyboard(unsigned char key, int x, int y)
{
if ( key == 27) exit (0);
}

void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);

glPushMatrix();
glColor3f(1.0, 0.0, 0.0);
glutSolidSphere(2, 20, 16);// sun
glRotated((double)year, 0.0, 1.0, 0.0);//公転
glTranslated(4.0, 0.0, 0.0);//次に描く惑星を原点からx方向に~移動
glRotated((double)day, 0.0, 1.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glutSolidSphere(0.5, 10, 8);//earth
glTranslated(1.0, 0.0, 0.0);
glRotated((double)day, 0.0, 1.0, 0.0);
glColor3f(1.0, 1.0, 0.0);
glutSolidSphere(0.2, 10, 8);//moon
glTranslated(5.0, 0.0, 0.0);
glRotated((double)year, 0.0, 1.0 ,0.0);
glColor3d(1.0, 1.0, 1.0);
glutWireTeapot(1.0);
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,280
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

fkh********さん

2014/5/1701:06:08

結構色々修正が必要ですね。


> 太陽、地球、月をスムーズシェーディングさせたい

まず、myInitの最後に
glEnable(GL_LIGHTING);
を追加するとシェーディングが有効になります。

シェーディングの設定を行うには、光源、マテリアルの設定が必要です。

ライティングは glLightfv(...); で光源の色と位置を、
マテリアルは、glMaterialfv(...); で設定します。


> 太陽の裏側になったときに、見えなくなるようにするにはどうしたらよいですか?

下記2点の修正で対応できます

1.
myInitの最後に glEnable(GL_DEPTH_TEST); を追加

2.
glClearの行を
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
に変更


> マウスのドラッグで視点を移動させるにはどうしたらいいですか?

glutMouseFunc();
glutMotionFunc();

でマウスの移動を取得できるイベントハンドラを設定できますので
そこでマウス移動量から視点位置を変更する処理を追加します。

視点位置は既にgluLookAt(...);を使用されているので、その引数
に渡す値をマウス操作で変更できるようにします。

質問した人からのコメント

2014/5/20 14:21:58

参考になりました(*^_^*)

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる