PythonによるOpen Dynamics Engine講座 その4
PyOpenGLの使い方


概要

ここでは、PyOpenGLの使い方を説明します。サンプルプログラムはここにあります。このプログラムは単に立方体が横にずれていくだけを描画します。

まず、OpenGL.GL、OpenGL.GLU、OpenGL.GLUTをインポートします。ここで from OpenGL.GL import * となってますが、単にimportだけした場合、関数(例えば.glClearColor()を使うときにOpenGL.GL.glClearColor()としなければなりませんが、from 〜import*としておくとglClearColor()ですみます。
あと、if __name__ == "__main__": main() というのがありますが、これはmain()をC言語でいうmain関数に割り当てます。
Pythonはmain関数なんか作らなくても直接プログラムにコマンドみたいに書けば実行してくれます。サンプルでもx = 0とかは関数内ではなく直接実行しています。
しかし、main関数にある程度まとめたほうが見やすいです。

プログラムの手順は以下のとおりです。

  1. 物体の位置x、y、zを0とする。
  2. init_GL()を実行する。
  3. _drawfunc ():を実行する。
  4. 無限ループ(glutMainLoop)開始。
  5. _idlefunc ()を実行する。
  6. もし、キーが押されたら_keyfuncを実行する。

init_GL()

init_GL()では、ウィンドウの作成、裏面は描画しないことの定義を行っています。
各関数は以下のことを実行しているものと思われます。


_drawfunc ()

_drawfunc ()では、prepare_GL()の実行、draw_body()の実行、glutSwapBuffers()を実行しています。

glutSwapBuffers()を実行しないと、画面が更新されません。

glutDisplayFunc (_drawfunc)とする必要があります。


prepare_GL()

prepare_GLでは、画面の初期化、光源の設定、視点の設定を実行しています。
各関数は以下のことを実行しているものと思われます。


draw_body()

draw_body()では立方体の描画をやってます。

回転行列rotは

となっている場合、x、y、zは物体の位置です。
R11〜R33は物体の姿勢を表しています。
例えば、x軸にθ回転したい場合、R11〜R33は

となり、y軸に回転したい場合は、

z軸に回転したい場合は、

とすれば良い。

glutSolidCube()以外にも、ドーナツ型を描画するglutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings)、円錐を描画するglutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks)、球を描画するglutSolidSphere(GLdouble radius, GLint slices, GLint stacks)があります。

あと、

glBegin(GL_TRIANGLES)
glVertex3f(x1,y1,z1)
glVertex3f(x2,y2,z2)
glVertex3f(x3,y3,z3)
glEnd()

で、glVertex3fの座標三点を結んだ三角形、

glBegin(GL_QUADS)
glVertex3f(x1,y1,z1)
glVertex3f(x2,y2,z2)
glVertex3f(x3,y3,z3)
glVertex3f(x4,y4,z4)
glEnd()

で、glVertex3fの座標四点を結んだ四角形が描画できます。


_idlefunc ()

_idlefunc ()では、物体の位置xの移動、glutPostRedisplay ()による再描画を行っています。

Pythonではglobal x という風にしないと関数の外で使った変数は使えません。

glutIdleFunc (_idlefunc)とする必要があります。


_keyfunc(c, x, y)

_keyfunc(c, x, y)はキーの入力を処理します。例えば、if c == "a" :などとすると、aを押したときに何かを実行させることができます。

サンプルの場合、何を押してもsys.exit (0)で強制終了します。

glutKeyboardFunc (_keyfunc)とする必要があります。

あと、マウスの入力に関する関数 glutMouseFunc(_mousefunc)、glutMotionFunc(_glutMotion)があります。


次回はPyOpenGLとpyODEを使って落ちる球を描画します。


PythonによるOpen Dynamics Engine講座に戻る

トップページへ戻る