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()