2019年7月20日土曜日

opengl ティーポットがカーソルキーで移動回転するようにした





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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts