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"」になってる。
[ ツッコむ ]
以上、1 日分です。