2018/11/09(金) [n年前の日記]
#1 [python] pygameとGLUTを同時に使おうとしてハマった
Windows10 x64 + Python 2.7.15 上で、pyagame 1.9.4 + PyOpenGL 3.1.3b2 + PyOpenGL-accelerate 3.1.3b2 の動作確認をしているのだけど。
_昔書いたスクリプト
が動かなくて…。gl や glu を使って描画する部分は動くのだけど、glut を使って teapot 等を描画してるところがエラーを出してしまう。おかしいな…。昔は動いていたんだけどなあ…。
ふと思いついた。バージョンがアレなのでは。
PyOpenGL、PyOpenGL-accelerate をアンインストールして。
PyOpenGL 3.1.0、PyOpenGL-accelerate 3.1.0 をインストール。
この状態なら、昔のスクリプトも動いた。そういうオチか…。
ふと思いついた。バージョンがアレなのでは。
PyOpenGL、PyOpenGL-accelerate をアンインストールして。
pip uninstall PyOpenGL pip uninstall PyOpenGL-accelerate
PyOpenGL 3.1.0、PyOpenGL-accelerate 3.1.0 をインストール。
pip install PyOpenGL pip install PyOpenGL-accelerate
この状態なら、昔のスクリプトも動いた。そういうオチか…。
◎ ソース。 :
こんな感じのソースで動作確認をした。とメモ。
_teapot_on_pygame.py
以下のような結果に。
_teapot_on_pygame.py
""" draw glut teapot on pygame * Windows10 x64 + Python 2.7.15 * pygame 1.9.4 + PyOpenGL 3.1.0 + PyOpenGL-accelerate 3.1.0 """ import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * SCRW, SCRH = 640, 480 class PyGame: def __init__(self): self._running = True self._screen = None def initialize(self, w, h): self.scrw = w self.scrh = h glutInit() glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH) pygame.init() # OPENGL向けに初期化 self._screen = pygame.display.set_mode( (w, h), pygame.OPENGL | pygame.DOUBLEBUF) if not self._screen: return glClearColor(0.0, 0.0, 0.0, 1.0) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0, float(w) / float(h), 0.1, 100.0) # gluOrtho2D(0, w, h, 0) glEnable(GL_DEPTH_TEST) # enable shading self.clock = pygame.time.Clock() self.xrot, self.yrot = (0.0, 0.0) self.xpos, self.ypos, self.zpos = (0.0, 0.0, -5.0) return True def onKeyDown(self, event): print(event.key, event.mod, event.unicode) if event.key == pygame.K_ESCAPE or event.unicode == u'q': self._running = False def onKeyUp(self, event): print(event.key, event.mod) def update(self): spd = 0.05 pressed_keys = pygame.key.get_pressed() if pressed_keys[pygame.K_UP]: self.zpos -= spd if pressed_keys[pygame.K_DOWN]: self.zpos += spd if pressed_keys[pygame.K_LEFT]: self.xpos -= spd if pressed_keys[pygame.K_RIGHT]: self.xpos += spd self.xrot += 0.25 self.yrot += 1.0 def draw(self): """ draw object """ # Clear OpenGL Buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glMatrixMode(GL_MODELVIEW) glLoadIdentity() # set camera # gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) glTranslatef(self.xpos, self.ypos, self.zpos) glRotatef(self.xrot, 1.0, 0.0, 0.0) glRotatef(self.yrot, 0.0, 1.0, 0.0) glScale(1.0, 1.0, 1.0) # draw teapot glColor3f(1.0, 0.0, 0.0) # color red glutWireTeapot(1.0) # wireframe # glutSolidTeapot(1.0) # solid # OpenGL drawing glFlush() # flip pygame double buffer pygame.display.flip() def execute(self, w, h): if not self.initialize(w, h): return # main loop while self._running: # self.clock.tick(60) self.clock.tick_busy_loop(60) for event in pygame.event.get(): if event.type == pygame.QUIT: self._running = False elif event.type == pygame.KEYDOWN: self.onKeyDown(event) elif event.type == pygame.KEYUP: self.onKeyUp(event) self.update() self.draw() cap = '%5.2f FPS' % (self.clock.get_fps()) pygame.display.set_caption(cap) if __name__ == "__main__": game = PyGame() game.execute(SCRW, SCRH) pygame.quit()
以下のような結果に。
[ ツッコむ ]
以上です。