2009.04.30
OpenGLで3D、やってみよう

先日、話題に上った google の O3D。
プラグインをインストールすれば、ブラウザ上で 3次元CG を表示できる!ということで、ちょっとだけ話題になりました。
O3Dは、OpenGLまたはDirect3Dを利用して 3D を描画します。
★ ん、ところで OpenGL って何?
OpenGLというのは、SGI社が開発したOSに依存しない 3D のためのライブラリのこと。
GLは、Graphics Libraryの略。
iアプリもiPhoneの 3D も、Androidの 3D も、みんな OpenGL を使ってます。
余談だけど、アメリカSGI社はチャプター11(日本の民事再生にあたる)を申請して、買収されてしまいました。
SGIといえば、CG屋にとってみれば憧れのブランド名だっただけに淋しいもんですね。
★ GLUTという便利なライブラリがあります
本日は、この OpenGL を、これまた便利な GLUT を使ってプログラミングしてみます。
OpenGLがOSに依存しないライブラリといっても、Windowsであればそれ専用の描画処理を書かなくてはならず、Linuxやモバイル機器用OSでも同じこと。
ウィンドウを生成したり、キーボード入力を取得したり、といった OS特有 の一般的な処理も吸収してくれるライブラリが GLUT です。
ライブラリというか、Utility Toolkitですね。
例えば
glutCreateWindow
という命令だけで、ウィンドウを作ってくれます(初期化など必要だけど)。
起動時に呼ばれる main 関数内で、OpenGLのメイン処理を呼び出して(OpenGLの処理を)ループさせるのが簡単な書き方。
なお、OpenGL を使ったプログラミングの「雰囲気」をお伝えしたいなぁと思ってこの記事を書いているので、以下のプログラムは完全ではありません。。。まあ、これぐらいなら調べればすぐに書けるようになります。
★ ウィンドウを描画してみる
ウィンドウを描画するだけなら、こんな感じです(以降、windows環境)。
#include <windows.h>
#include <GL/glut.h>
void disp(void ) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
int main(int argc , char ** argv) {
glutInit(&argc , argv); // 初期化
glutInitWindowPosition(50 , 50); // ウィンドウの位置
glutInitWindowSize(500 , 500); // ウィンドウのサイズ
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); // 描画モード
glutCreateWindow("My OpenGL Program"); // ウィンドウ生成
glutDisplayFunc(disp); // OpenGL処理の関数
glutMainLoop();
return 0;
}
あとはこの例だったら disp関数 にあれこれ書いていくと、CGを描画してくれます。
例えば、3角形ポリゴンは3つの頂点を指定すると描画してくれます。3D-CGの場合は、視点や視角、光源や材質指定など2次元とは大きく違う概念が入ってくるんだけど、ここでは説明を省きます。
このプログラムでは、ウィンドウ中心の座標が 0,0,0 で、全体に光が当たっていて、正面遠方から見ていると思ってください。
★ ポリゴンを1枚描画
では、ポリゴンを1つ作ってみましょう。
glBeginとglEndで囲まれた範囲に、頂点を3つ指定すれば完了です。
void disp(void ) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(0 , 0, 0);
glVertex3f(1 , 1, 0);
glVertex3f(-1 , 1, 0 );
glEnd();
glFlush();
}
勉強会では、この後に座標変換や光源などについて説明しました。ブログでは説明が長くなりすぎるのでここで終わりにします。
★ teapotだけ特別扱い
1つだけ、面白い関数を紹介。
3Dのテストなどで良く見かける「急須」のCG。これは、3D-CGプログラミングをしたことある人なら誰もが知っているような有名な「teapot」です。
ポリゴンを1枚1枚記述していたら大変すぎるけど、この teapot だけは例外で、関数1つで描画することができます。
glutSolidTeapot(0.5);
と書くだけで OK 。0.5というのはサイズです。由来は Wikipedia で「Utah teapot」を検索すると出てきます。

Trackback URL
Comment & Trackback
Comment feed
Comment