mieki256's diary



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 をアンインストールして。
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
"""
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()

以下のような結果に。

teapot_on_pygame_ss01.gif

以上です。

過去ログ表示

Prev - 2018/11 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project