質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

1回答

2926閲覧

OpenGLでの太陽系の惑星軌道

Beginnerman

総合スコア19

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2020/06/15 09:12

編集2022/01/12 10:55

OpenGLで太陽系の惑星軌道を描くプログラムを作成中です。
太陽を中心に公転する2つの惑星を描くことができました。
惑星はそれぞれ公転周期が異なるものですが、
これらの2つの惑星の公転の速度を変えるにはどうすればよいのでしょうか?

/* 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(); glutSolidSphere(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); glutSolidSphere(0.2, 10, 8); // planet glPopMatrix(); glPushMatrix(); glRotated((double)year, 0.0, 1.0, 0.0); glTranslated(2.0, 0.0, 0.0); glRotated((double)day, 0.0, 1.0, 0.0); glutSolidSphere(0.1, 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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/06/16 01:32

> 質問に追記(既存文面やコードを変更するのではなく,文字通りに記述を追加する)する形 と言うのは, 「元々の文面を1文字も修正や削除することなく完全にそのまま保持した状態で,その後ろ側に新たな記述を加える」という意味です. 質問文と回答やコメントの内容がミスマッチになってしまうと, これでは読み手には「何についての回答やコメントが行われているのか」が全く把握できなくなります. (元の文面が残っていないので,話の経過を追えない.) 例えば,「何かしらに困って検索した結果このページが検索にひっかかって見に来た人」には全く役に立たない(=ログとして機能しない)謎の文字列と化してしまうわけです. 少なくとも, 当初の問題点が解消したならば「解決」として質問を閉じ, 新たな問題点に関しては,別質問として切り分けるべきと思います.
guest

回答1

0

glRotatedglTranslatedの影響範囲をインデントで表現すると,以下のような感じです.

glutSolidSphere(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); glutSolidSphere(0.2, 10, 8);// planet glTranslated(1.0, 0.0, 0.0); glRotated((double)day, 0.0, 0.1, 0.0); glutSolidSphere(0.2, 10, 8);// planet2

"planet2"用のglutSolidSphereは,上記全てのglRotatedglTranslatedの影響を受ける形になっています.

回転や並進を星毎に設定すればよいのではないでしょうか.
glPushMatrix,glPopMatrixの意味を再確認すると良いでしょう.

投稿2020/06/15 09:45

編集2020/06/15 09:49
fana

総合スコア11632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Beginnerman

2020/06/15 10:41 編集

myDisplayを改変したのですがplanet2が回転しなくなってしまいました。 ``` void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0, 1.0, 1.0); glPushMatrix(); glutSolidSphere(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); glutSolidSphere(0.2, 10, 8); // planet glPopMatrix(); glPushMatrix(); glTranslated(2.0, 0.0, 0.0); glRotated((double)day, 0.0, 1.0, 0.0); glutSolidSphere(0.1, 10, 8); // planet2 glPopMatrix(); glutSwapBuffers(); } ```
fana

2020/06/15 10:54 編集

コメント欄にコードを書かれると非常に見難いので,質問に追記(既存文面やコードを変更するのではなく,文字通りに記述を追加する)する形にしていただくと良いように思います. あと,本件においては「回転」が2種類存在する(自転と公転)と思うので,そういった場合には誤解が生まれぬようにどちらを指すのかを明確にすると良いかと. で,現状は「自転はしているけども公転していない」のかと見受けます. ↓ 「planet2」にも「planet」と同様の処理を施せばよいのではないでしょうか. 「planet」側には,自転のためと見えるglRotated(dayを使うやつ)と,公転のためと見えるglRotated(yearを使うやつ)が作用していますが,「planet2」側にはday側のglRotatedしか記述されていない様子です.
Beginnerman

2020/06/15 11:18

ご指摘ありがとうございます。 コメント欄でなく質問本文のほうを編集する形にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問