3. GLUT

3.010 GLUT とは何ですか?それは OpenGL とどのように違うのですか?

OpenGLが、ルーチンを、windowingシステムまたは入力装置とインタフェースすることに提供しないので、アプリケーションは、この目的のためのさまざまな他のプラットフォーム具体的なルーチンを使わなければなりません。 結果は非ポータブルなコードです。

さらに、これらのプラットフォーム具体的なルーチンは全機能搭載である傾向があり、それは小さいプログラムおよび簡単なデモの建築を複雑にします

GLUTは、ウィンドウ管理、メニュー、および入力装置に、プラットフォームに依存しないインタフェースを簡単で、上品な方法で提供してこれらの問題に対処するライブラリです。 GLUTを使うことはいくらかの柔軟性の価格で来ます。

GLUTについての大量の情報はGLUT FAQにありますhttp://reality.sgi.com/mjk/glut3/glut-faq.html

3.020 GLUT を使わなければいけませんか?

アプリケーションは、GLUTが許さない事をする必要があるかもしれないか、または、それは、グラフィカルではない仕事を遂行するために、プラットフォーム具体的なライブラリを用いる必要があるかもしれません。 このケースにおいて、アプリケーションのwindowingのためのGLUTを使わないことを考慮し、ニーズを入力し、代わりに、プラットフォーム具体的なライブラリを使ってください .

あなた自身に以下の質問をしてください

もしこれらの問題のうちのいくつかにはい責任を負ったならば、GLUTがアプリケーションのための右の選択であるかどうかにかかわらず評価する必要があります

3.030 左マウスボタン押下時の操作と右マウスボタン押下時とで違う動作をする必要があります。しかし一つのglutMotionFunc() しか設定できません。それはパラメータとしてボタン情報を渡すことができません。どうしたら良いでしょう?

glutGetModifiers()とそれらの状態をチェックしてSHIFT、ALT、およびCTRLキーの状態に依存している種々の仕事を容易に設定できます

左右のマウスボタンのための種々の仕事を設定するために、どのマウスボタンが使用されているかに依拠している動作機能を交換する必要があります。 glutMouseFunc()に設定するマウス機能コールバックによってこれをすることができます。 このルーチンへの最初のパラメータは、どのボタンがイベントを起こしたかを示します(GLUT_LEFT、GLUT_MIDDLE、またはGLUT_RIGHT)。 2番目のパラメータはボタン状態を示します(GLUT_UPまたはGLUT_DOWN)。

説明するために、ここには例glutMouseFunc()コールバックルーチンがあります

私達の*/静的な動作機能について空のleftMotionのための/*宣言(int x、int y);
静的な空のrightMotion(int x、int y);
静的な空のmouseCallback(intマウス、int状態、int x、int y)
{
   ならば(state==GLUT_DOWN)
      /*Aボタンが押されています。 正しい動作機能 */ならば を設定してください(button==GLUT_LEFT
      )
         glutMotionFunc(leftMotion);
      他にならば(button==GLUT_RIGHT)
         glutMotionFunc(rightButton);
    } }

3.040 GLUT は何をするのですか?

しばしば、どのように十分な供給がウィンドウを作成するかを見つけ出すことが望ましいか、または入力装置、ディスプレイメニュー、または多くの他の仕事のうちの何でも処理します。 どのようにGLUTが何かをするかを見つけ出すのに最も良い方法が、GLUTソースをダウンロードしどのようにそれが手紙で知らせられるかをわかることです

3.050 GLUT でアニメーションを実行するにはどのようにしたら良いですか?

GLUTは、アプリケーションが、フレームをするためのコールバックルーチンを指定することを可能にします。 別のコールバックルーチンからglutPostRedisplay()を呼んでこのルーチンを実行することを強制できて、コントロールをglutMainLoop()に返します。

できる限り速く動くアニメーションを作成するために、アイドルなコールバックをglutIdleFunc()に設定する必要があります。 何も他に起こらない時には、パラメータとして通過するコールバックは、いつでもglutMainLoop()により実行されます。 このコールバックから、glutPostRedisplay()を呼びます。

調節されたアニメーションを作成するためには、glutIdleFunc()の代わりにglutTimerFunc()を使ってください。 glutTimerFunc()は、指定された時間経過の後にだけ、コールバックを呼びます。 このコールバックにより自身は使用不可にされます。従って継続的なアップデートのために、コールバックにより、そしてglutTimerFunc() 再度の タイマーをリセットする という両方のglutPostRedisplay()が呼ばれなければなりません。

3.060 ウィンドウを開いた後でそのサイズを変更することはできますか(glutInitWindowSize() とglutCreateWindow() を呼んだ後で)?

いったんコードがglutMainLoop()を入力し、コールバックルーチンのうちの1つが呼ばれたら、glutReshapeWindowを呼ぶことができます(int幅、int高さ)。

直ちにglutReshapeWindow()がウィンドウをリサイズしないことに注意してください。 ウィンドウをリサイズすることは単にメッセージをGLUTに送ります。 いったんglutMainLoop()に戻ったら、このメッセージは処理されます。

3.070 GLUT プログラム起動時に割り当てるメモリ領域がある、プログラム終了時にどのようにメモリを解放すればよいか?

もしユーザーが、キープレスやメニュー選択などを捕らえることができるあるインプットを通じてプログラムを終了するならば、答えは簡単です。 単に適切な入力イベントハンドラーでメモリを解放してください。

通常、ユーザーがウインドウ・フレーム制御(例えばタイトルバーの右上角にある Microsoft Windows の Close Windowアイコン)を用いて、プログラムを終了した時にこの問題が発生します。 この場合、あなたのプログラムは、プログラムが終了であることを示しているGLUTイベントが得られません。 実のところ、ウィンドウが破壊される時、glutMainLoop()は exit(0)を単に呼び出すだけです

メモリー割当て解除などの単純な資源のために、これは問題であるはずがありません。 OSは、プロセスが使っていたどのようなメモリーでも解放します。

ユーザーに仕事を保存することを促すか、ファイルにソフトウェアバッファーで持たれるデータをフラッシュすることは、懸念となります。

C++を使う時には、この問題の最も簡単な解決策は、GLUTアプリケーションをC++クラスの中に包み、グローバルな範囲によってそれを作成することです。 C++言語は、オブジェクトが範囲から出て行く時にクラスのデストラクタが呼ばれることを保証しています。

もう一つの方法は、プログラムを終了するとき、実行する機能のアドレスを指定するためにANSI C/C++ の atexit() 呼び出しを使うことである。 それらは、グローバルな範囲によってバッファとデータポインタを宣言するので、atexit()コールバックルーチンにアクセス可能である必要があります。 より多くの情報は ANSI C/C++ のリファレンスで見つかるかもしれません。 atexit() は C/C++ でだけ利用可能です。

1つの最終的な方法としてGLUTソースをハッキングする方法があります。glutMainLoop()が破壊ウィンドウイベント/メッセージを補足する時に、明示的なコールバックをコードに追加してください。 これは、無理矢理修正を行った glutMainLoop() の機能をアプリケーションに含めなければいけない方法のため、あまりいい方法ではありません。

3.080 GLUT プログラムでユーザがウィンドウを閉じたことをどのようにして知ることができますか?

前のセクション3.070と同じです

3.090 コールしたプログラムからどのようにして glutMainLoop() へ戻ってくることができますか?

glutMainLoop()は、呼び出しルーチンに戻るためにデザインされません。 出口方法がインプットイベントコールバックルーチンを通じて捕らえてGLUTは、イベント駆動アプリケーションのアイデアのまわりでGLUTメニューやキーボードコールバックハンドラなどデザインされました。

もしglutMainLoop()からプログラムに戻ることを強く主張するならば、そうするためのほんの1つの方法があります。 それを望んでいることをするために、GLUTソースおよび雇われたgluMainLoop()をダウンロードする必要があります。 そして、プログラム glutMainLoop()のこのハッキングされたバージョン にコンパイルし、リンクしてください。 スティーブベーカーは、詳細によって、どのように、この問題を取り除くために、glutMainLoop()をハッキングするかにウェブサイトを持っています

3.100 Windows の GLUT アプリケーションからどのようにしたらコンソールウィンドウを取り除けますか?

Visual C++6.0によって、プロジェクトメニュー、Settings…ダイアログに行ってください。 リンクタブを選んでください。 プロジェクトオプション編集ボックスにおいて、/SUBSYSTEMを追加してください:WINDOWS/ENTRY:現在のテキストの終わりへのmainCRTStartup。 リンクオプションは他のWindowsコンパイラのために同様です。

3.110 私の GLUT に関する質問の回答はここにはありません。どこにより詳しい情報がありますか?

SGIのGLUT FAQはGLUTについての情報の優秀なソースです