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. Odoo - company_idに基づいてレポートデータを取得する方法
- 4. luceneのURLに基づいてレコードを取得する方法
- 5. グループIDに基づいてリストを取得する方法
- 6. OBJECT_IDに基づいてデータベースオブジェクトを取得する方法は?
- 7. マウスの選択に基づいてオブジェクトをドラッグするOpengl
- 8. QtでコンパイルするOpenGL ES2を取得する方法
- 9. フィルタオブジェクトに基づいてオブジェクトをフィルタリングする方法
- 10. オブジェクトのリストに対するm2mの関係に基づいてモデルインスタンスを取得
- 11. androidのsqlite3の1列に基づいてレコードを取得する方法
- 12. datestampに基づいてファイルの再取得を自動化する方法
- 13. 文字列入力に基づいてリストを取得する方法
- 14. ASP.netの列名に基づいてListItemを取得する方法は?
- 15. uitableviewのセクションに基づいてインデックスパスを取得する方法は?
- 16. チェックボックスに基づいてビューからオブジェクトを渡す方法は?
- 17. Objective-C Protocol Madness - プロトコルに基づいてオブジェクトを返す方法?
- 18. マウスクリック位置に基づくロールオーバーポップアップ
- 19. qt内のラベルのマウスクリック位置を取得する
- 20. 有効なAccessTokenおよび/またはFacebook.FacebookClientオブジェクトに基づいてAppIDを取得する方法
- 21. GUIDに基づいてSharepointサイト名を取得するには?
- 22. apk署名に基づいて情報を取得する
- 23. カテゴリに基づいてランダムなエントリを取得する
- 24. 言語に基づいて文化を取得する
- 25. 色に基づいてサブジェクト名を取得する
- 26. 高さに基づいてテキストを取得する
- 27. Hibernate HQL childIDに基づいて親子を取得するクエリ
- 28. 他のリストに基づいてリストを取得する
- 29. データIDに基づいてjsonデータを取得する
- 30. 別のイメージギャラリーのマウスクリックに基づいてjCarouselの開始イメージを設定する方法は?
シェーダが普及しているので、オブジェクトごとにオブジェクトIDを設定し、フラグメントシェーダを使用して非混合非表示プレーンに書き込むのは簡単ではありませんか?ピッキングは、その平面からマウス座標で読み取られます。非投影やジオメトリ検索は不要です。 –
@Ben Voigt:マウスポインタの下にある1つのオブジェクトだけに興味がある限り、もちろんこれは非投影法にマッチします。ポインタの下にあるすべてのオブジェクトに興味がある場合は、線のピッキング方法を使用するか、深度のピーリングを使用する必要があります。しかし、ほとんどの深刻な3Dアプリケーションでは、オブジェクトは何らかの空間構造を使用して管理されており、これに対するテストが通常より簡単です。 – datenwolf
私はgluUnProjectとglReadPixelsを使用してピッキングを行いますが、結果は常に最も近いものではなく最も魅力的なオブジェクトです。理由は何ですか? – jondinham