解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で OpenGL を使ってみたい



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


かなり前の記事になりますが、 Python から OpenCV を使って画像認識の記事を結構たくさん書きました。

C# からは OpenGL を使っていたのですが、 Python では使ってませんでした。

【参考にしたサイト】
WindowsのPythonでOpenGLを使う - TadaoYamaokaの日記

とりあえず参考にしたサイトのソースコードを動かしてひとまず描画をやってみます。



動作環境


Windows 10
・winpython 64bit 3.4.4



プログラム

PyOpenGL をインストールします。

画像の通りに pip でインストール出来ます。



あとは、参考にしたサイトによると GLUT なるものが必要みたいです。

.zip なのでさっさとダウンロードして解凍しましょう。

参考にしたサイトにもリンクがありますが、下記の通りです。

GLUT ダウンロードサイト
https://www.transmissionzero.co.uk/software/freeglut-devel/

ダウンロードするのは画像の赤四角で囲われているリンクのファイルです。



.zip ファイルを解凍して中の freeglut\bin\x64\ にある freeglut.dll を C:\Windows\System32 にコピーする。

ソースコード


from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
 
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH)
    glutInitWindowSize(300, 300)     # window size
    glutInitWindowPosition(100, 100) # window position
    glutCreateWindow(b"teapot")      # show window
    glutDisplayFunc(display)         # draw callback function
    glutReshapeFunc(reshape)         # resize callback function
    init(300, 300)
    glutMainLoop()
 
def init(width, height):
    """ initialize """
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glEnable(GL_DEPTH_TEST) # enable shading
 
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    ##set perspective
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
 
def display():
    """ display """
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    ##set camera
    gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    ##draw a teapot
    glColor3f(1.0, 0.0, 0.0)
    glutWireTeapot(1.0)   # wireframe
#    glutSolidTeapot(1.0)  # solid
    glFlush()  # enforce OpenGL command
 
def reshape(width, height):
    """callback function resize window"""
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(width)/float(height), 0.1, 100.0)
 
if __name__ == "__main__":
    main()



結果

参考にしたサイト通りのティーポットが表示されました!

図1 ティーポット



コメント

CAD やアニメーションアプリなんかを作りたいです。

全然関係ないですが、 winpython の情報ってすくないですよね。



以上