pyopengl でティーポットがカーソルキーで移動回転するようにした。
#!/usr/bin/env python
#coding:utf-8
# [2019-07-19]
#@@@
#mを押せばポットが動きrを押せばポットが回転
#@@@
#参考サイト
#http://www.oit.ac.jp/is/L231/~whashimo/Article/OpenGL/Chapter4/index.html#Section1
#映像との相互作用
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
tx = 0
ty = 0
tz = 0
alpha = 0
beta = 0
gamma = 0
flg_move = 0
flg_rota = 0
def init():
#黒で画面クリア
glClearColor(0.0, 0.0, 0.0, 0.0)
glShadeModel(GL_SMOOTH) #フラットシェーディング
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()
#*glFrustum*
#引数はglOrthoと同じleft,right,top,bttom,znear,zfar
glFrustum(-5.0, 5.0, -5.0, 5.0, 5.0, 10000.0)
#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 tx
global ty
global tz
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(0.0, 0.0, -100.0)
#キーボードからの移動
glTranslatef(tx, ty, tz)
#キーボードからの回転
#z-y-z軸系オイラー角の変換
#*glRotatef*回転 角度は度数法つまり90度とか、ラジアンではない
glRotatef(alpha , 0.0, 0.0, 1.0)
glRotatef(beta , 0.0, 1.0, 0.0)
glRotatef(gamma , 0.0, 0.0, 1.0)
print "ty",ty
#gluLookAt(0.0, -2.5, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
#実際に色を塗る関数
glColor3f(1.0, 0.0, 0.0)
#引数は多分大きさ?
glutSolidTeapot(50.0)
glFlush()
glutSwapBuffers()
#mを押せばポットが動きrを押せばポットが回転
def keyboard(key, x, y):
global flg_move
global flg_rota
if key == 'm':
flg_move = 1
flg_rota = 0
if key == 'r':
flg_rota = 1
flg_move =0
if key == 'q' or key == 'Q':
sys.exit()
def special_key(key, x, y):
global tx
global ty
global tz
global alpha
global beta
global gamma
if flg_move == 1:
if key == GLUT_KEY_UP:
ty += 0.4
if key == GLUT_KEY_DOWN:
ty -= 0.4
if key == GLUT_KEY_LEFT:
tx -= 0.4
if key == GLUT_KEY_RIGHT:
tx += 0.4
if key == GLUT_KEY_PAGE_UP:
tz += 0.4
if key == GLUT_KEY_PAGE_DOWN:
tz -= 0.4
if flg_rota == 1:
if key == GLUT_KEY_UP:
alpha += 0.4
if key == GLUT_KEY_DOWN:
alpha -= 0.4
if key == GLUT_KEY_LEFT:
beta -= 0.4
if key == GLUT_KEY_RIGHT:
beta += 0.4
if key == GLUT_KEY_PAGE_UP:
gamma += 0.4
if key == GLUT_KEY_PAGE_DOWN:
gamma -= 0.4
glutPostRedisplay()
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)
glutKeyboardFunc(keyboard)
#特殊なキーの入力を受け付ける
#*glutSpecialFunc*
glutSpecialFunc(special_key)
glutMainLoop()
if __name__ == "__main__":
main()
0 件のコメント:
コメントを投稿