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() を終了させられるようになった模様。
PyOpenGL-Demo 3.1.1 の中の、NeHe/ の中を眺めていて、そういう記述ができることが分かった。
_PyOpenGL-Demo - PyPI
ちなみに、PyOpenGL-Demo のインストールの仕方は以下。
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」をつける必要があるらしい。
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() を使わないと、それらの特殊キーは読み取れない。
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() を通してから比較する方法もある模様。
「b'\x1b'」という記述が、「"\x1b"」になってる。また、「b'q'」が「"q"」になってる。
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"」になってる。
[ ツッコむ ]
以上です。