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()
以下のような結果に。
[ ツッコむ ]
以上です。
