5

私はしばらく前にGLUTを使用してOpenGLを使い始めました。メンバー関数をGLUT関数に渡すことはできません。(または、そのオプションについてはあまり詳しく調べませんでしたが、そのことについてはメンバーへのポインター)。

「まともな」方法があるのか​​、それともこれを解決するための「最もまともな」方法は何なのか疑問に思いました。静的メンバー関数を使用できることは知っていますが、もっと良い方法はありませんか?

C ++で記述され、C ++クラスベースのインターフェイスを提供するSFMLのような他のライブラリがあることは知っていますが、GLUT(正確にはフリーグルト)に関してどのような可能性があるのか​​疑問に思いました。

4

2 に答える 2

9

まず、GLUTは本格的なアプリケーション作業用ではありません。シンプルなグラフィックデモ用です。そしてその目的のために、それは大丈夫です。GLUTで真剣な仕事をしようとしていることに気付いた場合は、その制限を回避するために多くの時間を費やしていることに気付くでしょう。この制限は、最終的に遭遇する多くの制限の1つにすぎません。GLFWにはまだこの制限がありますが(次のバージョンにはありませんが)、一般的に、本格的なアプリケーション作業には優れています。

第二に、これを解決するための「最も適切な」方法は、何をしているかによって異なります。ウィンドウが1つしかない場合、正しい解決策は単純な静的関数です。これにより、関心のあるクラスへのグローバルポインター(またはグローバルポインターを返す関数)を使用できます。

複数のウィンドウがある場合、必要なのは、std::mapGLUTのウィンドウ識別子からオブジェクトへのポインタにマップするグローバルです。次に、特定の関数が呼び出されたウィンドウを取得し、マップを使用して、そのウィンドウを表す特定のオブジェクトにその呼び出しを転送できます。

于 2011-08-26T23:30:47.207 に答える
0

メンバー関数をglutや他のライブラリに渡すのは簡単です。GLUTは関数ポインタを探しています。

Controllerを、glutKeyboardFuncに送信するメンバー関数OnKeyPressを持つクラスとします。あなたは最初に次のようなことを試みたくなるかもしれません

glutKeyboardFunc(&Controller::OnKeyPress);

ここでは、関数ポインターを渡しますが、そのクラスオブジェクトのメンバー関数を送信するため、これは正しくありません。C ++ 11では、新しいstd :: bindを使用できます。古いコンパイラを使用している場合は、boost::bindをお勧めします。いずれにせよ、構文はほぼ同じです。

using namespace std::placeholders; // for the _1, _2 placeholders
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3));

ドキュメントから、glutKeyboardFuncには3つのパラメーターが必要であるように見えます。まず、オブジェクトのメンバー関数であるオブジェクトの最初の引数のメモリアドレスを修正してから、3つのプレースホルダーを指定します。

std :: bindを初めて使用する人にとっては奇妙に感じますが、Cでオブジェクト指向コードを実行したことがある人にとっては明らかです。この関数は実際には単なるC関数であり、クラスへの「this」ポインターが必要です。コールバックが単純な関数の場合、バインドは必要ありません。

于 2016-01-21T21:56:51.557 に答える