glutMainLoop();の呪縛。
3次元の図を描くのにOpenGL。
GLUTを使えばなんと簡単!みたいなWEBや文献はたくさんあるのだけど、CUIで動かしているプログラムの途中で描画し、またCUIに戻ってくるとか、コマンドラインの入出力と平行して描画を行う(計算途中の描画をリアルタイムで表示、かつ途中で変数をコマンドラインで入力)なんてなことをやろうとすると、glutMainLoopが阻んでくれる。
このglutMainLoopで描画されたウィンドウを閉じると、もれなく親プロセスまでプログラム全体道連れに終了してしまうのだ。。。。
しかし、世の中には、素晴らしい人々が、この願いの一部をかなえてくれている。
さて、まずは手元の環境
デフォルトで、GULT.frameworkとOpenGL.frameworkが存在していて、単にGLUTを使用したければ、これらをプロジェクトに追加しておけばいい。コンパイルして実行すれば、glutの描画を軽やか行ってくれる。
ここで、ネット上の各方面を探索すると、「freeglut」なるものが存在し、これは、glutMainLoopから戻ってくることが可能であると記載されている。
- http://wiki.livedoor.jp/mikk_ni3_92/d/freeglut%CA%D403
- http://wiki.livedoor.jp/mikk_ni3_92/d/freeglut%CA%D403%3a%3a%A4%DE%A4%C8%A4%E1
ウィンドウの「×ボタン」に対する処理
オリジナルのGLUTは、「glutMainLoop関数」から戻ってくる事が出来なかった。
しかし、freeglutでは「glutSetOption関数」を使う事で、メインループから戻ってくる事が可能である。第1引数に「GLUT_ACTION_ON_WINDOW_CLOSE」、
第2引数に「GLUT_ACTION_GLUTMAINLOOP_RETURNS」を指定すると戻ってくる。glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);
… …
glutMainLoop();
puts("Back from the free glutMainloop()");なお、
GLUT_ACTION_EXIT ⇒ デフォルト値
GLUT_ACTION_GLUTMAINLOOP_RETURNS ⇒ メインループから戻ってくる
GLUT_ACTION_CONTINUE_EXECUTION ⇒ プログラム実行し続ける
という3つの処理が用意されている。
ここで、問題になるのが、osxにfreeglutがインストールできるかどうか?という点。
WEBによれば
にて、配布されていると。これをコンパイルすれば!!!
ダウロードしてきたのはfreeglut-2.6.0。説明書通りに・・・・
./configure
make
.....
collect2: ld returned 1 exit status
make[2]: *** [libglut.la] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
なかなか前途多難にエラーが現れる。原因追及に関する情熱は中途で燃え尽き、これは断念。
幸いなことに、finkでfreeglutを発見したので
fink install freeglut
FINKとは?-> http://www.finkproject.org/index.php?phpLang=ja
ライブラリは/sw/libの下、ヘッダは/sw/includeの下にインストールされる。
そこで、xcodeのヘッダパスとライブラリパスを修正。
よく分からなければ、libfreeglut.a をプロジェクトにドラッグアンドドロップ、ヘッダファイルをソースファイルに放り込んでしまっても多分大丈夫。
さて、コンパイルアンド実行!
freeglut (.../build/Release/....): failed to open display 'localhost'
なる悲しげなエラーが出て表示されない・・・。
Xcodeから、DISPLAY環境変数を設定する方法がよく分からなかったので暫定解決策:
X11を起動する。適当なターミナルで、
export DISPLAY=:0.0
とする。
そして、コンパイルした実行ファイルのフォルダへ移動する
cd (プロジェクトフォルダ)/build/Release
./(プログラム名)
これで、X11上にグラフィックスが表示されるはず。