!/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 件のコメント:
コメントを投稿