初心者向けのPyOpenGLと少しお正月気分

画像



Python言語では、柔軟性とシンプルさにより、多数のアプリケーションやユーティリティを簡単かつ迅速に作成できます。 この言語は主に、システム管理に関連するさまざまなタスクの実装を容易にする小さなスクリプトを作成するために使用します。 判明したように、Pythonは、3Dグラフィックスの表示など、まったく「従来の」タスクではないために使用できます。 これは私の小さな新年の投稿になります。





この記事では、PythonでOpenGLを使用することがいかに簡単かを示します。 画面に3Dクリスマスツリーを描画します。 ツリーはかなり大ざっぱですので、投稿のシェーダーを使用した豪華なグラフィックスを期待している場合は、これ以上読むことはできませんが、興味はありません。



Python以外のライブラリ(OpenGLなど)を使用するには、Pythonプログラムからライブラリ関数を直接呼び出す機能を提供するモジュールが必要です。 PyOpenGLライブラリは、PythonプログラムのOpenGL、GLU、GLUT関数、および多数のOpenGL拡張機能を簡単に操作できるモジュールです。



したがって、仕事には次のものが必要です。



開発環境で、Pythonコード(拡張子.pyを持つ)で新しいファイルを作成して保存します。



3Dグラフィックス(特にOpenGL)を使用するには、いくつかのモジュールをインポートする必要があります。

from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import *
      
      





可能な限り、「余分な」コードを記述したり、新しいバイクを発明したりしないように、glutモジュールの関数を使用します。

ダブルバッファリングとRGB形式の色を使用して表示モードを初期化します(ダブルバッファリングにより、画面の再描画中のちらつきを回避できます)。

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
      
      





初期ウィンドウサイズ(幅、高さ)を設定します。

 glutInitWindowSize(300, 300)
      
      





画面の左上隅に対するウィンドウの初期位置を指定します。

 glutInitWindowPosition(50, 50)
      
      





OpenGlを初期化しましょう:

 glutInit(sys.argv)
      
      





「Happy New Year!」というタイトルのウィンドウを作成します。

 glutCreateWindow(b"Happy New Year!")
      
      





メインプログラムループを実行します。

 glutMainLoop()
      
      





プログラムを実行すると、「Happy New Year!」というタイトルの空のウィンドウが表示されます。 これは素晴らしいことですが、主なものが欠けています-クリスマスツリー! したがって、私たちはそこで止まらず、さらに先へ進みません。



クリスマスツリーの描画を開始する前に、一連の準備アクティビティを実行するか、つまり初期化を実行する必要があります。 これを行うには、別のプロシージャを作成し、メインプログラムループを開始する前に呼び出すことを忘れないでください。 このプログラムでは、初期化手順は次のとおりです。

 #   def init(): global xrot #     x global yrot #     y global ambient #   global greencolor #    global treecolor #    global lightpos #    xrot = 0.0 #     x = 0 yrot = 0.0 #     y = 0 ambient = (1.0, 1.0, 1.0, 1) #    -    RGB,   -  greencolor = (0.2, 0.8, 0.0, 0.8) #     treecolor = (0.9, 0.6, 0.3, 0.8) #     lightpos = (1.0, 1.0, 1.0) #      xyz glClearColor(0.5, 0.5, 0.5, 1.0) #      gluOrtho2D(-1.0, 1.0, -1.0, 1.0) #        glRotatef(-90, 1.0, 0.0, 0.0) #      90  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient) #     glEnable(GL_LIGHTING) #   glEnable(GL_LIGHT0) #     glLightfv(GL_LIGHT0, GL_POSITION, lightpos) #    
      
      





変数xrotとyrotは、x軸とy軸に沿った回転角度を決定します(すべての側面からツリーを検査できるようにするために、これは後で必要になります)。 アンビエント配列は、拡散照明のパラメーターである色と明るさを定義します。 次に、2つの変数(greencolor、treecolor)が設定されます。これらの変数は、針の緑色と胴体の茶色を決定します。



glClearColor関数は、各新しい再描画サイクルの前に画面が塗りつぶされる色を決定します。 gluOrtho2D関数を使用して、図面の水平方向と垂直方向の境界を決定します。 glRotatef関数を使用して、X軸に沿って90度シフトするため、ツリーをよりよく見ることができます。 glLightModelfv関数は、拡散照明モデルを設定します。 glEnable(GL_LIGHTING)で照明をオンにします。 照明をオンにするだけでは不十分です。少なくとも1つの光源を追加する必要があります。 glEnable関数(GL_LIGHT0)でこれを行います。 最後に、新しく作成された光源を脇に移動します。

 glLightfv(GL_LIGHT0, GL_POSITION, lightpos)
      
      





これで、OpenGLの初期化は完了したと見なすことができます。 準備措置が1つだけ残っています。キーストロークを処理し、glutにそれを使用するよう指示するプロシージャを作成する必要があります(これを行うには、メインプログラムループを開始する前にglutSpecialFunc(specialkeys)関数を実行します。specialkeysプロシージャ自体は次のようになります。

 #     def specialkeys(key, x, y): global xrot global yrot #      if key == GLUT_KEY_UP: #   xrot -= 2.0 #      X if key == GLUT_KEY_DOWN: #   xrot += 2.0 #      X if key == GLUT_KEY_LEFT: #   yrot -= 2.0 #      Y if key == GLUT_KEY_RIGHT: #   yrot += 2.0 #      Y glutPostRedisplay() #   
      
      





specialkeysコードでは、キーボードのどの矢印が押されたかに応じて、xrot変数またはyrot変数の値を増減するか、glutPostRedisplayを呼び出して画面を再描画します。



すべて、今、あなたは主なものに進むことができます-クリスマスツリーを描く! specialkeys関数と同様に、画面を再描画するために使用する手順をglutに知らせます:glutDisplayFunc(描画)。 描画手順自体は次のとおりです。

 #   def draw(): global xrot global yrot global lightpos global greencolor global treecolor glClear(GL_COLOR_BUFFER_BIT) #       glPushMatrix() #    "" glRotatef(xrot, 1.0, 0.0, 0.0) #    X   xrot glRotatef(yrot, 0.0, 1.0, 0.0) #    Y   yrot glLightfv(GL_LIGHT0, GL_POSITION, lightpos) #       #    #  :   2 ,  ,   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor) glTranslatef(0.0, 0.0, -0.7) #    Z  -0.7 #     0.1,  0.2 #       glutSolidCylinder(0.1, 0.2, 20, 20) #    #  :   2 ,  ,   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greencolor) glTranslatef(0.0, 0.0, 0.2) #    Z  0.2 #    ()   0.5,  0.5 #       glutSolidCone(0.5, 0.5, 20, 20) glTranslatef(0.0, 0.0, 0.3) #    Z  -0.3 glutSolidCone(0.4, 0.4, 20, 20) #    0.4,  0.4 glTranslatef(0.0, 0.0, 0.3) #    Z  -0.3 glutSolidCone(0.3, 0.3, 20, 20) #    0.3,  0.3 glPopMatrix() #    "" glutSwapBuffers() #       
      
      





glClear関数(GL_COLOR_BUFFER_BIT)は、画面を灰色で塗りつぶすために使用されます。 glPushMatrix()とglPopMatrix()関数のペアにより、ツリーのみを回転させることができます。 glLightfv関数(GL_LIGHT0、GL_POSITION、lightpos)は、光源を「静的に」点灯したままにして、ツリーとともに光源を「回転」させます。 glMaterialfv関数(GL_FRONT_AND_BACK、GL_DIFFUSE、色)は、両面描画モード、拡散照明を設定し、オブジェクトが描画される色を設定します。 glutSolidCone関数(0.5、0.5、20、20)を使用して針を描画し、glutSolidCylinder関数(0.1、0.2、20、20)を使用して木の幹を描画します。 これらの関数の最初の2つのパラメーターは半径と高さを決定し、最後の2つは形状(ポリゴン)を構成する要素の数を決定します。 ツリーのすべての部分がビデオカードのメモリに描画された後、関数glutSwapBuffers()を呼び出して画面に表示します。



すべてのプログラムコード:
 #    : from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * import sys #     global xrot #     x global yrot #     y global ambient #   global greencolor #    global treecolor #    global lightpos #    #   def init(): global xrot #     x global yrot #     y global ambient #   global greencolor #    global treecolor #    global lightpos #    xrot = 0.0 #     x = 0 yrot = 0.0 #     y = 0 ambient = (1.0, 1.0, 1.0, 1) #       RGB,   -  greencolor = (0.2, 0.8, 0.0, 0.8) #     treecolor = (0.9, 0.6, 0.3, 0.8) #     lightpos = (1.0, 1.0, 1.0) #      xyz glClearColor(0.5, 0.5, 0.5, 1.0) #      gluOrtho2D(-1.0, 1.0, -1.0, 1.0) #        glRotatef(-90, 1.0, 0.0, 0.0) #      90  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient) #     glEnable(GL_LIGHTING) #   glEnable(GL_LIGHT0) #     glLightfv(GL_LIGHT0, GL_POSITION, lightpos) #     #     def specialkeys(key, x, y): global xrot global yrot #      if key == GLUT_KEY_UP: #   xrot -= 2.0 #       if key == GLUT_KEY_DOWN: #   xrot += 2.0 #       if key == GLUT_KEY_LEFT: #   yrot -= 2.0 #      Y if key == GLUT_KEY_RIGHT: #   yrot += 2.0 #      Y glutPostRedisplay() #    #   def draw(): global xrot global yrot global lightpos global greencolor global treecolor glClear(GL_COLOR_BUFFER_BIT) #       glPushMatrix() #    "" glRotatef(xrot, 1.0, 0.0, 0.0) #    X   xrot glRotatef(yrot, 0.0, 1.0, 0.0) #    Y   yrot glLightfv(GL_LIGHT0, GL_POSITION, lightpos) #       #    #  :   2 ,  ,   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor) glTranslatef(0.0, 0.0, -0.7) #    Z  -0.7 #     0.1,  0.2 #       glutSolidCylinder(0.1, 0.2, 20, 20) #    #  :   2 ,  ,   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greencolor) glTranslatef(0.0, 0.0, 0.2) #    Z  0.2 #    ()   0.5,  0.5 #       glutSolidCone(0.5, 0.5, 20, 20) glTranslatef(0.0, 0.0, 0.3) #    Z  -0.3 glutSolidCone(0.4, 0.4, 20, 20) #    0.4,  0.4 glTranslatef(0.0, 0.0, 0.3) #    Z  -0.3 glutSolidCone(0.3, 0.3, 20, 20) #    0.3,  0.3 glPopMatrix() #    "" glutSwapBuffers() #        #     #        RGB (, , ) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) #     (, ) glutInitWindowSize(300, 300) #          glutInitWindowPosition(50, 50) #  OpenGl glutInit(sys.argv) #     "Happy New Year!" glutCreateWindow(b"Happy New Year!") #  ,    glutDisplayFunc(draw) #  ,     glutSpecialFunc(specialkeys) #     init() #    glutMainLoop()
      
      







プログラムの結果(クリスマスツリーの栄光):



画像



画像



およびいくつかのビデオ:







投稿で説明した機能を使用すると、新年のツリーだけでなく、3次元グラフやさまざまなシステムのモデルを描画することもできます。



この記事が誰かにとって有益であり、Python言語とOpenGL仕様のさらなる研究を奨励することを願っています。

明けましておめでとうございます!



PS シェーダーを使用したPyOpenGLに関する次の投稿へのリンク。



All Articles