2019年7月18日木曜日

opengl 太陽と地球、月を 見立てた球を表示 回転させる。







!/usr/bin/env python
#coding:utf-8
#[2019-07-15]

#惑星.png

#@@@
#太陽と地球、月を 見立てた球を表示 回転させる。
#地球を自転させている
#視点の位置の初期値は原点なので,gluLookAtで調整する必要がある
#色をつけデプスバッファを有効にする
#ワイヤーフレームからソリッドモデルに変更
#@@@

#参考サイト
#同次変換の利用と3次元
#http://www.oit.ac.jp/is/L231/~whashimo/Article/OpenGL/Chapter3/index.html
#人工知能に関する断創録
#http://aidiary.hatenablog.com/entry/20080915/1281751154

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

theta_e = 0 #地球の自転角度
theta_mk = 0 #月の回転角度(度)
theta_ek = 0 #地球の回転角度(度)

def idle(value):
    global theta_e
    global theta_ek
    global theta_mk
    theta_e += 5.2
    theta_ek += 0.4
    theta_mk += 1.0
    glutPostRedisplay()
    #プログラム中でウィンドウの再描画イベントを発生させる
    glutTimerFunc(1 , idle , 0)


def init():
    #色の指定
    glClearColor(1.0, 1.0, 1.0, 1.0)
    glEnable(GL_DEPTH_TEST)
    #光源の設定と物体の質感
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_COLOR_MATERIAL)

#resizeはウィンドウリサイズ時と最初に一回実行される
def resize(w,h):
    print "resize"
    glViewport(0,0,w,h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()

    #最後の引数2つをデフォルトのままだと画像が途中で消える場合がある
    #なんでかなと何時間も悩む事になる
    #glOrtho(-1.0, 1.0, -1.0, 1.0, -9.0, 9.0)

    #*kamera* *siten*
    #glFrustum(-0.1, 0.1, -0.1, 0.1, 0.0, 10.0)
    #カメラ座標は多分デフォルトで(0,0,0)
    #下は多分カメラの座標を0として向こう側に1.0から10.0まで見る
    #事になる。物体はデフォルトで(0,0,0)に描かれるから
    #物体をz軸で-1以上移動させなければならない。
    #または、gluLookAtで視点を移動させなければならない。
    gluPerspective(20.0, w/h, 1.0, 10.0)
    #glTranslated(0.0, 0.0, -5.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def display():
    print "display"
    global theta_e
    global theta_ek
    global theta_mk

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    #gluLookAtも座標変換ですので, glLoadIdentity()を使うか,
    #glPushMatrix()とglPopMatrix()を使ってワー ルド座標系を保護するよう
    #にして下さい.
    glLoadIdentity()
    #物体が見えるように全体を下げる 1.5の数値
    #-2.5より+2.5のほうが感覚的に遠近感がわかりやすい
    gluLookAt(0.0, -2.5, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    #gluLookAt(0.0, 2.5, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

    #*kyuu_frame*
    #フレームの球はデフォルトでzが上のような感じで緯度経度が
    #描かれる
    #実際に色を塗る関数
    glColor3d(1.0, 0.0, 0.0)
    glutSolidSphere(0.2, 36, 18)
    #glutWireSphere(0.2, 36, 18)#太陽


    #太陽座標系入れる-----------------
    #座標変換行列を行列スタック*10にしまっておくという機能
    glPushMatrix()

    #球フレームは回転軸方向に地軸があるような感じで描かれる
    #z軸周りに地球回転
    glRotatef(theta_ek, 0.0, 0.0, 1.0)
    #x軸に60平行移動
    glTranslatef(0.60, 0.0, 0.0)

    #ここまで地球座標系 その行列をスタックに入れる----
    glPushMatrix()
    glColor3d(0.0, 1.0, 0.0)
    glutSolidSphere(0.1, 16, 8)
    #glutWireSphere(0.1, 16, 8)#地球
    glRotatef(theta_e, 0.0, 0.0, 1.0)#地球自転
    glPopMatrix()
    #地球座標系取り出す-------------------------

    #z軸周りに月回転
    glRotatef(theta_mk, 0.0, 0.0, 1.0)
    #x軸に20平行移動
    glTranslatef(0.20, 0.0, 0.0)
    glColor3d(1.0, 1.0, 0.0)
    glutSolidSphere(0.05, 16, 8)
    #glutWireSphere(0.05, 16, 8)#月


    glPopMatrix()
    #太陽座標系出す-----------------

    glFlush()
    glutSwapBuffers()


def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(500, 500)
    glutCreateWindow("惑星")
    init()
    glutDisplayFunc(display)
    glutReshapeFunc(resize)
    glutTimerFunc(5 , idle , 0)
    #glutIdleFunc(idle2)
    glutMainLoop()

if __name__ == "__main__":
    main()

                                                         


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts