Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

OpenGL初心者が3時間で基礎を学ぶ | その3

OpenGL初心者が3時間で基礎を学ぶ | その3

話している暇はありません。おそらくこのページを見に来た方はOpenGLを学ぶモチベーションがあることと思います。環境はPyOpenGL = Python + OpenGLです。前編はこちら->OpenGL初心者が3時間で基礎を学ぶ | その2

※ このページは「Python Programming in OpenGL」(PDF,英語)を日本語で解説してくのが目的です。

その3:関数(方程式)からグラフを描く

前回までは、点や線の基本的な使い方を学びました。しかし、ただ点を打ったり、線を引いたりしても面白くありません。その3では、方程式を使って自動で(?)描かせます。

# # -*- coding: utf-8 -*-
##################################################################
# 
# PyFunc.py
# 
# Chapter 5.2 Plotting 2D Functions
# < http://www.math.uiuc.edu/~gfrancis/illimath/StanBlank/PyOpenGL.pdf >
# 
##################################################################

""" OpenGLパッケージをインポート """
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
""" 数値演算用パッケージのインポート """
# from Numeric import * # 参考書
import numpy as np # 今回はNumericの代わりにNumpyを使う事にします。


def init():
 """ 描画エリアの初期化関数 """
 glClearColor(1.0, 1.0, 1.0, 1.0)
 gluOrtho2D(-5.0, 5.0, -5.0, 5.0)


def plotfunc():
 glClear(GL_COLOR_BUFFER_BIT)

 """ 点の描画 """
 glColor3f(0.0, 0.0, 0.0)
 glPointSize(3.0)

 glBegin(GL_POINTS)
 """ ここが今日の本題 """
 # 方程式を描かすために、定義域内部でループを回します。
 for x in np.arange(-5.0, 5.0, 0.1):
   """ 描かす方程式 """
   y = x*x
   glVertex2f(x,y)
 glEnd()

 """ 座標軸の表示 """
 glBegin(GL_LINES)
 glVertex2f(-5.0, 0.0)
 glVertex2f(5.0, 0.0)
 glVertex2f(0.0, 5.0)
 glVertex2f(0.0, -5.0)
 glEnd()


 """ フラッシュ! """
 glFlush()

def main():
 """ おまじない """
 glutInit(sys.argv)
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
 glutInitWindowSize(500,500)
 glutInitWindowPosition(10,10)
 glutCreateWindow("PyFunc.py | Function Plotter")
 glutDisplayFunc(plotfunc)

 init()
 glutMainLoop()
# main関数の実行
main()

描画結果

スクリーンショット 2015-04-22 21.24.44

 

見事に三次曲線を描かせる事ができました。(グラフ描画の光が見えてきました)

解説

プログラムの大部分は前回までで説明したおまじないばかりですので、特に説明は少ないです。

点を打つ関数

glBegin(GL_POINTS)
for x in np.arange(-5.0, 5.0, 0.05):
    y = x*x
    glVertex2f(x,y)
glEnd()

さて、ポイントを打つには、3つの手順をとるんでした。

  1. glBegin(GL_POINTS): 頂点を打つことを宣言する。

  2. glVertex2f(x,y): 頂点の座標を宣言する。

  3. glEnd(): 描画の終わりを宣言する。

簡単です。

これにy = 2*x**2 - 3*x**2という三次方程式を描かせているだけです。簡単ですね。

for文にあるnp.arangePython標準ライブラリにあるrange関数の浮動小数点まで扱えるように拡張されたものです。(Numpyを使っている方ならわかると思いますので、申し訳ないですが説明は割愛します)

 

さてさて

次へ行きましょう

 

チュートリアル形式で始めるOpenGL[2D編]

チュートリアル形式で始めるOpenGL[2D編]

実例で学ぶゲーム3D数学

実例で学ぶゲーム3D数学

ドラマCD 俺の彼女と幼なじみが修羅場すぎる

ドラマCD 俺の彼女と幼なじみが修羅場すぎる

ゾンビ彼女†グロカワ育成ダークシミュレーション

ゾンビ彼女†グロカワ育成ダークシミュレーション