OpenGL初心者が3時間で基礎を学ぶ | その2
OpenGL初心者が3時間で基礎を学ぶ | その2
話している暇はありません。おそらくこのページを見に来た方はOpenGLを学ぶモチベーションがあることと思います。環境はPyOpenGL = Python + OpenGLです。前編はこちら
※ このページは「Python Programming in OpenGL」(PDF,英語)を日本語で解説してくのが目的です。
その2:点を描く
描くか描かせるかは使う人次第。
# -*- coding: utf-8 -*- ################################################################## # # PyPoints.py # Setting a coordinate system with central origin # # Chapter 5 2Dimensional Graphics # 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 def init(): """ 描画エリアの初期化関数 """ glClearColor(0.0, 0.0, 0.0, 1.0) gluOrtho2D(-1.0, 1.0, -1.0, 1.0) def plotpoints(): glClear(GL_COLOR_BUFFER_BIT) glColor3f(1.0, 0.0, 0.0) """ 描画開始宣言(おまじない) """ glBegin(GL_POINTS) glVertex2f(0.0, 0.0) """ 描画終了宣言(おまじない) """ glEnd() glFlush() def main(): """ おまじない """ glutInit(sys.argv) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) glutInitWindowSize(500,500) glutInitWindowPosition(100,100) glutCreateWindow("PyPoints.py | Plot Points") glutDisplayFunc(plotpoints) init() glutMainLoop() main() print u'画面の真ん中に赤い点が表示されていると成功です。'
結果。
もはや見えない。。真ん中に赤の点が表示されます。
解説
初期化関数
def init(): """ 描画エリアの初期化関数 """ glClearColor(0.0, 0.0, 0.0, 1.0) gluOrtho2D(-1.0, 1.0, -1.0, 1.0)
init関数はmain関数から一度呼ばれます。
def main(): """ おまじない """ glutInit(sys.argv) ... init() glutMainLoop() ...
glClearColor(r,g,b,a): 背景色の指定
ここでは、glClearColor(R,G,B,A)を使って、背景色の指定をしています。今回は(R,G,B) = (0,0,0)なので黒を指定してます。最後のAは透過です。値はパーセンテージなので、0から1までを指定するだけで良いです。ちなみに背景を白にしたければglClearColor(1.0, 1.0, 1.0, 1.0)とすればできます。簡単ですね。
gluOrtho2D(x-left, x-right, y-bottom, y-top): 2D座標の定義
二次元座標の定義です。難しくはありません大丈夫です。今回のコードではgluOrtho2D(-1.0, 1.0, -1.0,1.0)としていますよね。これは、画面の端から端までの座標は-1.0から1.0だよと指定してあげているのです。ですので、プログラムの途中にでてくるのですが、点を打つ座標を(-0.5, -0.5)と言うようにするだけで、この画面内で点を打つことができます。つまり、自分で作った座標を使えるわけで、画像のピクセルサイズ等を気にしなくて良いんです。(便利)
点を打つ関数
def plotpoints(): """ 画面の初期化 """ # init()で指定した色で塗りつぶされる glClear(GL_COLOR_BUFFER_BIT)
それでは点を打っていきます。まずglClear(GL_COLOR_BUFFER_BIT)を使って、点を打つ前にinit関数で指定した色で画面全体を塗りつぶします。ここらへんはおまじないです。(まだ)あまり深く考えなくても大丈夫です。
""" 色の指定 """ glColor3f(1.0, 0.0, 0.0) """ 描画開始宣言(おまじない) """ glBegin(GL_POINTS) """ 描画させる """ # 座標点をしてい glVertex2f(0.5, 0.0) # ここでいろいろ描かせる... """ 描画終了宣言(おまじない) """ glEnd()
さてここからが今日の本題です。
glColor3f(r,g,b): 色の指定
まず描画する色を指定します。ここで****3fとは色を3つの浮動小数点で宣言することを表していて、0から1までのパーセンテージ表示になります。今回は赤なので(1.,0.,0.)です。
glBegin(GL_POINTS): 描画の開始
glBegin(GL_POINTS)で点を描画する事を宣言します。
glVertex2f(x,y): 点の座標を宣言
また***2fとでてきました。2fとは2つの浮動小数点を表しているので、ここでは2Dの座標点を2つの浮動小数点で宣言してます。この座標に先ほど指定した色(赤)で点が打たれます。Vertexとは頂点のことです。
glEnd(): 描画の終了
描画開始を宣言したので、描画終了も同じく宣言して、無事終了です。
glFlush(): フラッシュ!!
フラッシュします。つまり、描きます。おまじないです。
main関数
def main(): """ おまじない """ glutInit(sys.argv) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) glutInitWindowSize(500,500) glutInitWindowPosition(100,100) glutCreateWindow("PyPoints.py | Plot Points") glutDisplayFunc(plotpoints) init() glutMainLoop()
さて今回からmain関数を作りました。これは、OpenGLをセットアップするルーティン(おまじない)達をまとめてしようというのがもくろみです。これらはいつも使うので、まとめておきましょう。
拡張
先ほどは頂点が小さすぎて見えなかったので、サイズを大きくしましょう。
""" 色の指定 """ glColor3f(1.0, 0.0, 0.0) """ 頂点サイズの指定 """ glPointSize(10.0) """ 描画開始宣言(おまじない) """ glBegin(GL_POINTS) """ 描画させる """ glVertex2f(0.0, 0.0) glVertex2f(0.5, 0.0) glVertex2f(-0.5, 0.0) """ 描画終了宣言(おまじない) """ glEnd()
glPointSize(size) : 頂点のサイズの設定
頂点サイズは簡単にかえきれます。下は描画結果です。
拡張:線の描画
""" 点の描画 """ glColor3f(1.0, 0.0, 0.0) glPointSize(20.0) glBegin(GL_POINTS) glVertex2f(0.5, -0.5) glVertex2f(-0.5, 0.5) glVertex2f(0.0, 0.0) glVertex2f(-0.5, -0.5) glVertex2f(0.5, 0.5) glEnd() """ 線の描画 """ glColor3f(0.0, 1.0, 0.0) glLineWidth(5.) # glBegin(GL_LINES) # glBegin(GL_LINE_STRIP) glBegin(GL_LINE_LOOP) glVertex2f(0.5, -0.5) glVertex2f(-0.5, -0.5) glVertex2f(-0.5, 0.5) glVertex2f(0.5, 0.5) glEnd()
同じ要領で線も引けます。パターンがわかってきたでしょう。
次にはこちら
- 作者: 林武文,加藤清敬
- 出版社/メーカー: コロナ社
- 発売日: 2003/04
- メディア: 単行本
- 購入: 3人 クリック: 38回
- この商品を含むブログ (13件) を見る
GLUTによるOpenGL入門―「OpenGL Utility Toolkit」で簡単3Dプログラミング! (I・O BOOKS)
- 作者: 床井浩平
- 出版社/メーカー: 工学社
- 発売日: 2005/05
- メディア: 単行本
- 購入: 7人 クリック: 66回
- この商品を含むブログ (17件) を見る
OpenGLでつくる3次元CG&アニメーション - VC++ .NET,Cg言語によるアプリケーションの制作
- 作者: 酒井幸市
- 出版社/メーカー: 森北出版
- 発売日: 2008/02/20
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 17回
- この商品を含むブログ (3件) を見る
OpenGL初心者が3時間で基礎を学ぶ | その1
OpenGL初心者が3時間で基礎を学ぶ | その1
話している暇はありません。おそらくこのページを見に来た方はOpenGLを学ぶモチベーションがあることと思います。環境はPyOpenGL = Python + OpenGLです。前編はこちら
※ このページは「Python Programming in OpenGL」(PDF,英語)を日本語で解説してくのが目的です。
初めてのPyOpenGLコード
helloは書きません。代わりにおしゃれなティーポットがでてきます。
# -*- coding: utf-8 -*- ################################################################## # # ogl1.py # # Chapter 4 Your First OpenGL Program # http://www.math.uiuc.edu/~gfrancis/illimath/StanBlank/PyOpenGL.pdf # ################################################################## """ パッケージのインポート(おまじない) """ from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * def draw(): """ 画面のクリア(おまじない) """ glClear(GL_COLOR_BUFFER_BIT) """ 描画するオブジェクト(今日やること)""" # 適当に1つ選択 glutWireTeapot(0.5) # glutSolidTeapot(0.5) # glutWireSphere(0.5, 10, 10) # glutSolidSphere(0.5, 10, 10) # glutWireCube(1.0) # glutSolidCube(1.0) # glutWireTetrahedron() # glutSolidTetrahedron() """ Flush!!(おまじない) """ glFlush() """ OpenGLの画面構成やら (後に解説があるので、とりあえずはおまじない) """ glutInit(sys.argv) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) glutInitWindowSize(250,250) glutInitWindowPosition(100,100) glutCreateWindow("My Second OGL Program") glutDisplayFunc(draw) glutMainLoop()
結果。
Teapot
Sphere
Cube
いろいろと書かれていますが、やっていることは一つです。
def draw(): """ 画面のクリア(おまじない) """ glClear(GL_COLOR_BUFFER_BIT) """ 描画するオブジェクト(今日やること)""" # 適当に1つ選択 glutWireTeapot(0.5) # glutSolidTeapot(0.5) # glutWireSphere(0.5, 10, 10) # glutSolidSphere(0.5, 10, 10) # glutWireCube(1.0) # glutSolidCube(1.0) # glutWireTetrahedron() # glutSolidTetrahedron() """ Flush!!(おまじない) """ glFlush()
ここの適当に選択
の部分でTeapotoやSphere(球)などのオブジェクトを選んで表示させているだけです。括弧ないの数値はサイズ等のパラメータ。簡単。(大丈夫です、書けば5分でわかります)
とりあえず今回の学びは、描画ではなくて、おまじないの部分を知っておいてください。今後はこのおまじないをベースに拡張して行く事になります。
では。
その2へ続く
GLUT/freeglutによるOpenGL入門 (I・O BOOKS)
- 作者: 床井浩平
- 出版社/メーカー: 工学社
- 発売日: 2015/10
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: 林武文,加藤清敬
- 出版社/メーカー: コロナ社
- 発売日: 2003/04
- メディア: 単行本
- 購入: 3人 クリック: 38回
- この商品を含むブログ (13件) を見る
GPU並列図形処理入門 ~CUDA・OpenGLの導入と活用 (Software Design plus)
- 作者: 乾正知
- 出版社/メーカー: 技術評論社
- 発売日: 2014/02/18
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- 作者: Fletcher Dunn,Ian Parberry,松田晃一
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/10/04
- メディア: 大型本
- 購入: 21人 クリック: 141回
- この商品を含むブログ (42件) を見る
理系が恋に落ちたので証明してみた。(1) (メテオCOMICS)
- 作者: 山本アリフレッド
- 出版社/メーカー: ほるぷ出版
- 発売日: 2016/11/10
- メディア: コミック
- この商品を含むブログを見る
僕の彼女がマジメ過ぎる処女ビッチな件 (2) (角川コミックス・エース)
- 作者: 松本ナミル
- 出版社/メーカー: KADOKAWA
- 発売日: 2016/10/26
- メディア: コミック
- この商品を含むブログを見る
アイドルな彼女とヲタクな僕と 3 (ヤングチャンピオン烈コミックス)
- 作者: 春日旬丸木戸サトシ
- 出版社/メーカー: 秋田書店
- 発売日: 2016/11/18
- メディア: コミック
- この商品を含むブログを見る
OpenGL初心者でもわかるグラフ描画の猫の手
OpenGL初心者でもわかるグラフ描画の猫の手
これまで、Matlabを使って解析をしているが、そろそろオープンソースを使っておかないと今後Matlabを使えなくなったときに手がつけきれなくなると思いPythonを使って数値計算をできるように心がけている。
先日ウェーブレット解析をしてみようと、Pythonを使って進めていた。
グラフの表示にはPyQtGraph
しかし、全然進まない。
アルゴリズムの実装段階(理解段階)においては計算途中のデータを可視化しながら進める必要がある。
Matlabであればその都度グラフを表示するのだが、使いなれていないPyQtGraphだと、PyQtGraphの使い方も調べなければいけないし、アルゴリズムのミスも見つけなければいけないとかなり手間がかかってややこしくなった。結局PyQtの描画周辺の理解が浅いことと、アルゴリズムの実装とを別で考えなければ行けないことが身にしみてわかった。できるつもりになっていた自分が恥ずかしい。その反省もふまえまずは、グラフィック系の基礎勉強をする事にする。それで選んだのがOpenGL。OpenGLならプラットフォームや言語に左右されることなく使えるし、今後の技術として学んでおきたいところ。Pythonで動かすにはPyOpenGLというライブラリがあるのでPyQtと平行して使う事にする。
事前調査
OpenGLとは
OpenGL(オープンジーエル、Open Graphics Library)は、Khronosグループが策定しているグラフィックスハードウェアのアプリケーションプログラミングインタフェース (API)。2次元・3次元コンピュータグラフィックス両方が扱える。オープン仕様として公開され、幅広い処理系に対応しているため、広く一般に普及している。グラフィックデバイスとの直接通信を行なう抽象化レイヤーAPIであるため、非常に高速に動作し、高精度な3D画像を描画できる。有償・無償の豊富な補助ライブラリがあるのも特色として挙げられる。http://ja.wikipedia.org/wiki/OpenGL
GL,GLU,GLUTとは
pyqtのサンプルを調べていると、GL,GLU,GLUTとインポートしているのを見受けられるので調べると。どうも拡張ライブラリみたいだ。ここら辺はチュートリアルを回しながらわかってくるだろう。
補助・拡張ライブラリ
OpenGLそのものは、ハードウェアに近い低次のライブラリである。そのため、よりソフトウェアに近い、多くの高次の補助・拡張ライブラリが存在する。主に、3D描画機能を簡易化・拡張するもの、ウインドウシステムをサポートするもの、グラフィックス面以外の機能を付加するものに分けられる。
- GLU - カメラや球、円筒、曲面などの取り扱いを補助する
- GLUT - クロスプラットフォームのOpenGL対応ウィジェット・ツールキット http://ja.wikipedia.org/wiki/OpenGL
参考サイト
PyOpenGL本家
http://pyopengl.sourceforge.net/documentation/index.html
Python Programming in PyOpenGl (PDF, 英語)
手取り足取り教えてくれる
http://www.math.uiuc.edu/~gfrancis/illimath/StanBlank/PyOpenGL.pdf
2D graphics rendering tutorial with PyOpenGL
http://cyrille.rossant.net/2d-graphics-rendering-tutorial-with-pyopengl/
とりあえずサンプルをまねしてみる。
なにごともまずは半歩踏み出さないと行けない。参考記事ばっかり眺めてても一生わからない。
# ogl1.py from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * def draw(): glClear(GL_COLOR_BUFFER_BIT) glutWireTeapot(0.5) glFlush() glutInit(sys.argv) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) glutInitWindowSize(250,250) glutInitWindowPosition(100,100) glutCreateWindow("My Second OGL Program") glutDisplayFunc(draw) glutMainLoop()
結果。ティーポットがでてきた。
- 作者: 林武文,加藤清敬
- 出版社/メーカー: コロナ社
- 発売日: 2003/04
- メディア: 単行本
- 購入: 3人 クリック: 38回
- この商品を含むブログ (13件) を見る
GLUTによるOpenGL入門―「OpenGL Utility Toolkit」で簡単3Dプログラミング! (I・O BOOKS)
- 作者: 床井浩平
- 出版社/メーカー: 工学社
- 発売日: 2005/05
- メディア: 単行本
- 購入: 7人 クリック: 66回
- この商品を含むブログ (17件) を見る
入門ゲームプログラミング (Professional Game Developerシリーズ)
- 作者: チャールズ・ケリー,Charles Kelly,株式会社ぷれす
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/01/30
- メディア: 大型本
- この商品を含むブログ (2件) を見る
- 作者: Fletcher Dunn,Ian Parberry,松田晃一
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/10/04
- メディア: 大型本
- 購入: 21人 クリック: 141回
- この商品を含むブログ (42件) を見る
- 発売日: 2016/09/13
- メディア: Amazonビデオ
- この商品を含むブログを見る
理系が恋に落ちたので証明してみた。(1) (メテオCOMICS)
- 作者: 山本アリフレッド
- 出版社/メーカー: ほるぷ出版
- 発売日: 2016/11/10
- メディア: コミック
- この商品を含むブログを見る
- 作者: 原泰久
- 出版社/メーカー: 集英社
- 発売日: 2016/10/19
- メディア: コミック
- この商品を含むブログ (2件) を見る