読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



キーボードの利用

Pygame

キーボードを使う方法です。ティーポットがキーボードによって回転します。上下左右キーで回転速度が上がります。また、Lキーを押すとライティングのオンオフを切り替えます。照明をオフにするとマテリアルが無効になるのでglColor3f()で設定した青色が見えます。

keyboard.py
f:id:aidiary:20100814110815p:plain

サンプルスクリプト

#!/usr/bin/env python
#coding:utf-8
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

ESCAPE = 27  # ESCキー
xrot = yrot = 0.0  # 回転角度
xspeed = yspeed = 0.0  # 回転速度

# 照明
light_ambient = [1.0, 1.0, 1.0, 1.0]    # 環境光(白色)
light_diffuse = [1.0, 1.0, 1.0, 1.0]    # 拡散光(白色)
light_specular = [1.0, 1.0, 1.0, 1.0]   # 鏡面光(白色)
light_position = [2.0, 2.0, 1.0, 1.0]   # 照明の位置

# マテリアル
no_mat = [0.0, 0.0, 0.0, 1.0]           # 反射しない
mat_ambient = [0.0, 0.0, 0.3, 1.0]      # 環境光の青成分だけ少し反射
mat_diffuse = [1.0, 0.0, 0.0, 1.0]      # 拡散光の赤成分を全反射
mat_specular = [1.0, 1.0, 1.0, 1.0]     # 鏡面光の全成分を全反射
mat_emission = [0.3, 0.3, 0.2, 0.0]     # 放射の色
no_shininess = [0.0]                    # 鏡面反射しない
low_shininess = [5.0]                   # 弱い鏡面反射
high_shininess = [100.0]                # 強い鏡面反射

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(300, 300)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("キーボードの利用")
    glutDisplayFunc(display)
    glutReshapeFunc(reshape)
    glutIdleFunc(idle)
    glutKeyboardFunc(keyboard)
    glutSpecialFunc(keyboard)
    init(300, 300)
    glutMainLoop()

def init(width, height):
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glEnable(GL_DEPTH_TEST)
    
    # ライティングの設定
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient)
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular)
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)
    glEnable(GL_LIGHTING)  # ライティングを有効にする
    glEnable(GL_LIGHT0)    # 0番目の照明を有効にする
    
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)

def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    
    # マテリアルの設定
    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat)
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse)
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular)
    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess)
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat)
    
    # 回転
    glRotatef(xrot, 1.0, 0.0, 0.0)
    glRotatef(yrot, 0.0, 1.0, 0.0)
    
    glColor3f(0.0, 0.0, 1.0)
    
    # Teapotの描画
    glutSolidTeapot(1.0)
    
    glutSwapBuffers()

def reshape(width, height):
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)

def idle():
    global xrot, yrot
    xrot += xspeed
    yrot += yspeed
    glutPostRedisplay()

def keyboard(key, x, y):
    global xspeed, yspeed
    
    # 特殊キー
    if key == ESCAPE:
        sys.exit()
    elif key == GLUT_KEY_UP:
        xspeed -= 0.1
    elif key == GLUT_KEY_DOWN:
        xspeed += 0.1
    elif key == GLUT_KEY_LEFT:
        yspeed -= 0.1
    elif key == GLUT_KEY_RIGHT:
        yspeed += 0.1
    
    # 一般キー
    if key == "l":  # 照明のオンオフ
        if glIsEnabled(GL_LIGHTING):
            glDisable(GL_LIGHTING)
        else:
            glEnable(GL_LIGHTING)

if __name__ == "__main__":
    main()