OpenGL 回転と隠面処理2

OpenGL 回転と隠面処理 - Ruby - juntkの日記」をPythonで書き直しただけ。
Vimの置換コマンド便利だなあ。

「Error (1002) creating CGSWindow」

classの中でglutCreateWindow()やらglutMainLoop()すべきではない...とりあえず。

ソース

# encoding: utf-8

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

import sys

class Sample:

    def display(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_PROJECTION)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        gluPerspective(30.0, 320.0 / 240.0, 1.0, 10.0)
        gluLookAt(0.0, 0.0, self.zoom,
                  0.0, 0.0, 0.0,
                  0.0, 1.0, 0.0)

        # Y軸を中心として回転(横回転)
        glRotate(self.rotateX, 0.0, 1.0, 0.0)
        # X軸を中心として回転(縦回転)
        glRotate(self.rotateY, 1.0, 0.0, 0.0)

        #隠面処理の有効範囲
        glEnable(GL_DEPTH_TEST)

        # X-Z
        glBegin(GL_QUADS)
        glColor3d(1.0,0.0,0.0)
        glVertex3f(-0.5,0.0,-0.5)
        glVertex3f(0.5,0.0,-0.5)
        glVertex3f(0.5,0.0,0.5)
        glVertex3f(-0.5,0.0,0.5)
        
        # Y-Z
        glColor3d(0.0,1.0,0.0)
        glVertex3f(0.0,-0.5,-0.5)
        glVertex3f(0.0,0.5,-0.5)
        glVertex3f(0.0,0.5,0.5)
        glVertex3f(0.0,-0.5,0.5)
        glEnd()

        #隠面処理おわり
        glDisable(GL_DEPTH_TEST)

        # glFlush()は使わない
        glutSwapBuffers()
    
    def keyboard(self,key,x,y):
        self.spd = 2.0
        # keyboard: Esc
        if key == "q" : exit()
        # keyboard: l
        if key == "l" : self.rotateX -= self.spd
        # keyboard: h
        if key == "h" : self.rotateX += self.spd
        # keyboard: j
        if key == "j" : self.rotateY -= self.spd
        # keyboard: k
        if key == "k" : self.rotateY += self.spd
        if key == "u" : self.zoom += 0.2
        if key == "n" : self.zoom -= 0.2


    def repaint(self):
        # 再描画
        glutPostRedisplay()

    def __init__(self):
        self.rotateX = 10
        self.rotateY = 10

        self.zoom = -5.0

    def start(self):
        glutMainLoop()


if __name__ == "__main__":
    s = Sample()

    glutInitWindowPosition(100,100)
    glutInitWindowSize(320,240)
    glutInit()
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutCreateWindow("python-opengl 01")

    glutDisplayFunc(s.display)
    glutKeyboardFunc(s.keyboard)

    # repaint
    glutIdleFunc(s.repaint)

    glClearColor(1.0, 1.0, 1.0, 1.0)

    glutMainLoop()