mieki256's diary



2022/09/10() [n年前の日記]

#1 [python][windows] PyOpenGLについて調べてる

Windows10 x64 21H2 + Python 3.9.13 x64 + PyOpenGL 3.1.6 で実験中。記述の仕方についていくつか分かったことがあるのでメモ。

glutMainLoop() の終了のさせ方。 :

GLUT を使っていた頃は glutMainLoop() を終了させる方法が無かったらしいけど、freeglut では glutLeaveMainLoop() が追加されて、glutLeaveMainLoop() を呼ぶと glutMainLoop() を終了させられるようになった模様。

def _keyfunc(key, x, y):

    ESCAPE = "\x1b"
    # ESCAPE = b'\x1b'

    key = key.decode("ascii", "ignore")
    print("Push key,", key, x, y)

    if key == ESCAPE or key == "q":
        print("Exit")
        if glutLeaveMainLoop:
            glutLeaveMainLoop()
        else:
            sys.exit()

# ...

def main():

    # ...

    glutKeyboardFunc(_keyfunc)
    
    glutMainLoop()

PyOpenGL-Demo 3.1.1 の中の、NeHe/ の中を眺めていて、そういう記述ができることが分かった。

_PyOpenGL-Demo - PyPI

ちなみに、PyOpenGL-Demo のインストールの仕方は以下。
pip install PyOpenGL-Demo
(Python3インストールフォルダ)\Lib\site-packages\OpenGL_Demo\ の中に展開される。

キーの読み取りその1。 :

PyOpenGL は、glutKeyboardFunc() や glutSpecialFunc() を使うことで、キーが押された時に呼ばれる関数を登録できるのだけど、どのキーが押されたか比較する記述で悩んだ。昔は key == 'q' といった感じで書けたようだけど…。

Python 3.x では、b'q' とか b'\x1b' といった感じで、最初に「b」をつける必要があるらしい。

def keyboard(key, x, y):
    """ キーボードが押された時に呼ばれるコールバック関数. """
    global xspeed, yspeed

    # ESC key
    ESCAPE = b'\x1b'

    # ESCAPE = 27
    # ESCAPE = chr(27)
    # ESCAPE = '\033'
    # ESCAPE = "\x1b"
    
    if key == ESCAPE or key == b'q':
        if glutLeaveMainLoop:
            glutLeaveMainLoop()
        else:
            sys.exit()
    elif key == GLUT_KEY_UP:
        xspeed -= 0.1
    elif key == GLUT_KEY_DOWN:
        xspeed += 0.1
    elif key == GLUT_KEY_LEFT:
        yspeed -= 0.1
    elif key == GLUT_KEY_RIGHT:
        yspeed += 0.1
    elif key == b'l':  # 照明のオンオフ
        if glIsEnabled(GL_LIGHTING):
            glDisable(GL_LIGHTING)
        else:
            glEnable(GL_LIGHTING)

# ...

def main():

    # ...

    glutKeyboardFunc(keyboard)
    glutSpecialFunc(keyboard)

ESCキーをどう記述すればいいのかで結構悩んだ…。Python 2.x 時代は、27、chr(27)、'\033'、'\x1b' 等を指定してたけど…。Python 3.x では b'\x1b' と書けばいいらしい。

カーソルキーが押されたかどうかは、GLUT_KEY_UP、GLUT_KEY_DOWN、GLUT_KEY_LEFT、GLUT_KEY_RIGHT と比較すれば判別できる。ただ、glutSpecialFunc() を使わないと、それらの特殊キーは読み取れない。

キーの読み取りその2。 :

前述の記述は、引数に何の処理もしないで読み取る際の記述だけど、.decode() を通してから比較する方法もある模様。

def _keyfunc(key, x, y):

    ESCAPE = "\x1b"
    # ESCAPE = b'\x1b'

    key = key.decode("ascii", "ignore")
    print("Push key,", key, x, y)

    if key == ESCAPE or key == "q":
        print("Exit")
        if glutLeaveMainLoop:
            glutLeaveMainLoop()
        else:
            sys.exit()

# ...

    glutKeyboardFunc(_keyfunc)

「b'\x1b'」という記述が、「"\x1b"」になってる。また、「b'q'」が「"q"」になってる。

以上です。

過去ログ表示

Prev - 2022/09 - 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