2011-06-18 31 views
5

Qt-OpenGLでアプリケーションを作成しようとしています。ここでは、マウスのクリックに基づいて、クリックされたオブジェクトを知る必要があります。私のアイデアは、ポイント(オブジェクトの領域をQWidgetに格納する)であり、マウスクリックをこれらのポイントに合わせることです。誰でもこれをする方法を言うことができますか、または任意の体は他の方法を示すことができますか?Qt OpenGL-マウスクリックに基づいてオブジェクトを取得する方法

答えて

14

この問題は、通常、「ピッキング」と呼ばれます。 OpenGL自体は物事を描くだけで、ジオメトリオブジェクト管理はありません(OpenGLにはオブジェクトがありますが、通常はリソースと呼ばれます)。

最近、OpenGLのピッキングを実装する通常の方法は、クリック位置(glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth))で深度値を取得し、それをワールドスペース(gluUnProject(...))に投影しないことです。これにより、クリックされたポイントの(x,y,z)が表示されます。

通常、ジオメトリ構造をクリック座標にトラバースすることで、空間的な細分構造(BSP、Kdなど)でジオメトリを管理するので、そのようにオブジェクトを取得できます。

もう1つの方法は、クリックに続くレイをシーンに投影し、光線/境界線の交差テストを行います。

古いOpenGL選択メカニズムの使用を強くお勧めします。使用するのが遅くて面倒です。

+0

シェーダが普及しているので、オブジェクトごとにオブジェクトIDを設定し、フラグメントシェーダを使用して非混合非表示プレーンに書き込むのは簡単ではありませんか?ピッキングは、その平面からマウス座標で読み取られます。非投影やジオメトリ検索は不要です。 –

+1

@Ben Voigt:マウスポインタの下にある1つのオブジェクトだけに興味がある限り、もちろんこれは非投影法にマッチします。ポインタの下にあるすべてのオブジェクトに興味がある場合は、線のピッキング方法を使用するか、深度のピーリングを使用する必要があります。しかし、ほとんどの深刻な3Dアプリケーションでは、オブジェクトは何らかの空間構造を使用して管理されており、これに対するテストが通常より簡単です。 – datenwolf

+0

私はgluUnProjectとglReadPixelsを使用してピッキングを行いますが、結果は常に最も近いものではなく最も魅力的なオブジェクトです。理由は何ですか? – jondinham

関連する問題