ここから本文です

#include <stdlib.h> #include <GL/glut.h> #include <math.h> int year = 0, d...

ck_********さん

2011/11/916:09:59

#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) 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;
}

このプログラムを改良して太陽系(水星・金星・地球・火星・木星・土星・天王星・海王星)を
作成したいんですが、よくわかりません。
どのようにすればよいのか詳しい方法(やり方・答えなど)教えてくださるとうれしいです。
よろしくお願いします。

補足申し訳ございませんが頭が悪いので
いくつか例をあげてもらってよろしいでしょうか。

閲覧数:
509
回答数:
1
お礼:
250枚

違反報告

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

buy********さん

編集あり2011/11/920:30:27

>ck_a_yanakaさん

void myDisplay(void)
関数の中でご希望の星を描画する様にすれば出来ます。

glutWireSphere関数で球体を追加してます。このvoid myDisplay(void)出てくる関数を調べて、使い方を調べればOKです。

入門サイトへのリンクを貼っておきます。このサイトのサンプル動かしながら、OpenGLの仕組みや、関数の使い方を調べた方が良いと思います。サンプルどれもグラフィカルで動かすだけでも楽しいです。

http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
http://www.komoto.org/opengl/

よろしくお願い致します。


*** 補足について

頭の良さは関係ありません。どちらかと言うと忍耐力かも、頭良い方がこんなことやってられないと言うことで、プログラム嫌いかもしれません。

1個惑星追加してみました。

--- gl002.c
#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);

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();
// ---ここから追加
glPushMatrix();
glRotated((double)year*2, 0.0, 1.0, 0.0);
glTranslated(5.0, 0.0, 0.0);
glRotated((double)day*2, 0.0, 1.0, 0.0);
glutWireSphere(0.5, 10, 8);
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;
}
---

この要領で追加してみて下さい。

よろしくお願い致します。

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

2011/11/9 21:44:16

お手数おかけして申し訳ございません。本当にありがとうございました。大変わかりやすく説明いただき本当にありがとうございます。

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

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

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

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

閉じる

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

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

閉じる