Qt-OpenGLでアプリケーションを作成しようとしています。ここでは、マウスのクリックに基づいて、クリックされたオブジェクトを知る必要があります。私のアイデアは、ポイント(オブジェクトの領域をQWidgetに格納する)であり、マウスクリックをこれらのポイントに合わせることです。誰でもこれをする方法を言うことができますか、または任意の体は他の方法を示すことができますか?Qt OpenGL-マウスクリックに基づいてオブジェクトを取得する方法
5
A
答えて
14
この問題は、通常、「ピッキング」と呼ばれます。 OpenGL自体は物事を描くだけで、ジオメトリオブジェクト管理はありません(OpenGLにはオブジェクトがありますが、通常はリソースと呼ばれます)。
最近、OpenGLのピッキングを実装する通常の方法は、クリック位置(glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)
)で深度値を取得し、それをワールドスペース(gluUnProject(...)
)に投影しないことです。これにより、クリックされたポイントの(x,y,z)
が表示されます。
通常、ジオメトリ構造をクリック座標にトラバースすることで、空間的な細分構造(BSP、Kdなど)でジオメトリを管理するので、そのようにオブジェクトを取得できます。
もう1つの方法は、クリックに続くレイをシーンに投影し、光線/境界線の交差テストを行います。
古いOpenGL選択メカニズムの使用を強くお勧めします。使用するのが遅くて面倒です。
関連する問題
- 1. Cのマウスクリックに基づいてアクティブなウィンドウ名を取得する#
- 2. オブジェクトに基づいてマップから値を取得する方法
- 3. マウスの選択に基づいてオブジェクトをドラッグするOpengl
- 4. Odoo - company_idに基づいてレポートデータを取得する方法
- 5. IDに基づいて開始月を取得する方法
- 6. 値に基づいてラジオボタン名を取得する方法
- 7. PHP:IPアドレスに基づいて地域を取得する方法
- 8. クリックに基づいて配列を取得する方法
- 9. 座標に基づいて要素を取得する方法
- 10. `innerText`に基づいてElementHandleを取得する方法は?
- 11. luceneのURLに基づいてレコードを取得する方法
- 12. グループIDに基づいてリストを取得する方法
- 13. OBJECT_IDに基づいてデータベースオブジェクトを取得する方法は?
- 14. Nifi:filefilterに基づいてフローファイルを取得する方法
- 15. idに基づいてページ番号を取得する方法
- 16. QtでコンパイルするOpenGL ES2を取得する方法
- 17. モデルフィルタクエリに基づいてすべての関連オブジェクトを取得
- 18. オブジェクト内のテキストに基づいて特定のオブジェクトを取得する
- 19. AngularJS UI-Router/$ stateParams - オブジェクトIDに基づいてデータを取得
- 20. TextViewに基づいて特定のJSONオブジェクトを取得
- 21. 別のオブジェクトのキーに基づいてキーの値を取得
- 22. 値に基づくオブジェクトの取得/フィルタリング
- 23. IDに基づいてすべての文書を取得する方法は?
- 24. ループに基づく範囲内のオブジェクトのアドレスを取得する方法は?
- 25. フィルタオブジェクトに基づいてオブジェクトをフィルタリングする方法
- 26. 行数に基づいてs3オブジェクトを分割する方法
- 27. タイムスタンプに基づいてオブジェクトの配列をフィルタリングする方法
- 28. Cookieに基づいて対応するHttpSessionを取得する方法
- 29. qt内のラベルのマウスクリック位置を取得する
- 30. OpenGLはC++のマウスクリック時にカーソル座標を取得
シェーダが普及しているので、オブジェクトごとにオブジェクトIDを設定し、フラグメントシェーダを使用して非混合非表示プレーンに書き込むのは簡単ではありませんか?ピッキングは、その平面からマウス座標で読み取られます。非投影やジオメトリ検索は不要です。 –
@Ben Voigt:マウスポインタの下にある1つのオブジェクトだけに興味がある限り、もちろんこれは非投影法にマッチします。ポインタの下にあるすべてのオブジェクトに興味がある場合は、線のピッキング方法を使用するか、深度のピーリングを使用する必要があります。しかし、ほとんどの深刻な3Dアプリケーションでは、オブジェクトは何らかの空間構造を使用して管理されており、これに対するテストが通常より簡単です。 – datenwolf
私はgluUnProjectとglReadPixelsを使用してピッキングを行いますが、結果は常に最も近いものではなく最も魅力的なオブジェクトです。理由は何ですか? – jondinham