りさーちゃーのひよこ
技術のこととか
2014年6月9日月曜日
freeglutをインストール→glutMainLoop()を使わないで処理
#背景 3DシミュレーションをしたくてGLUTを使っていたのだが、下記理由から探したらfreeglutがヒットしたのです。 - glutMainLoop()の使い勝手の悪さに発狂…するわけではないが、こいつを使わずして自作whileループで色々と処理をしたくなった。 - 特に、コールバック関数に非静的な関数を登録することができないため、せっかくオブジェクト指向で書いたメソッドをstaticにして公開しなければならない。その中で使用する変数もstaticで…なんてことしているうちにカプセル化なにそれ?的な危険なコードが出来上がってしまった。 - glfwや.Netという手もあったが、glutである程度作りこんであったので手間なしで移行をしたかった。 #手順 てなわけで、glut->freeglutの移行となりましたが、超簡単にできました。下記の手順で移行をしました。なお、glutが使用できる状態まであらかじめセットアップされていることを前提に話を進めます。<br /> <br /> ##1. freeglutをインストールする。 インストール手順は次のサイトを参考にしました。<br /> <a href="https://www.blogger.com/null"></a> <a href="http://andorelseif.com/IMYGraphics/Wiki/doku.php?id=opengl:installfreeglut" target="_blank" title="">IMY Graphics - freeglutの導入</a><br /> コンパイルするのが面倒だったので、以下のサイトからfreeglutのバイナリをダウンロードしました。<br /> <a href="https://www.blogger.com/null"></a><a href="http://www.transmissionzero.co.uk/software/freeglut-devel/" target="_blank" title="">Transmission Zero - freeglut Windows Development Libraries</a><br /> <br /> 私の環境では、以下のパスにそれぞれコピーしました。<br /> include → <u>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\GL</u><br /> ※glut.hは必ずfreeglut付属のものに置き換える。通常のglut.hとは互換性がないよう。<br /> lib → <u>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib</u><br /> dll → <u>C:\Windows\SysWOW64\freeglut.dll</u><br /> ##2. ソースコードの中のインクルードファイルを置き換える。 #include<GL/glut.h> → #include<GL/freeglut.h><br /> ##3. glutMainLoop()をソースコードから削除(コメントアウト)する。 やった!<br /> ##4. コールバック関数の登録を見直す。 私の場合<br /> whileループ型に変換してもkeyboard() 関数は使いたいのでglutKeyboardFunc()で登録したまま。<br /> display() 関数はwhileの中で使いたいので、glutDisplayFunc()は削除(コメントアウト)。<br /> idle() 関数は登録しても何も起こらないよう。freeglutの仕様と思う。よって削除(コメントアウト)。<br /> ##5. glutMainLoop()があった箇所に下記のような関数を記述する。 私は複数の画面を出したかったので、下記のようなコードとなる。<br /> display1(), display2(), idle() はもともとコールバック登録をしていた関数を流用している。<br /> このように記述すればglutMainLoop()使用時と同様の動作を実現できる。<br /> <br /> <pre class="brush: cpp;"> void CLASS::mainLoop(void) { while(true) { glutMainLoopEvent(); // これがfreeglut独自の関数 // Window1 glutSetWindow(this->winId[0]); this->display1(); // Window2 glutSetWindow(this->winId[1]); this->display2(); this->idle(); // (とか、何かやりたい処理とか自由に) } } </pre> <br /> glutMainLoopEvent()で登録したコールバック関数が有効になる。これはglutにはなくfreeglutに存在する関数である。<br /> あとは煮るなり焼くなりで加工すればよし。<br /> display()もidle()も非静的なメソッドにできる。<br /> 私の場合はkeyboard()やmouse()だけが静的メソッドになるが、これはもう割り切ってソフトウェア設計でカバーする。</div> <br />
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿