OpenGLでマウスを使用してオブジェクトを選択するには、何が必要ですか?私は選択バッファのような何かを見つけたが、私はまた、それが減価償却された場所をいくつか読んだ。だから私は立ち往生して何を探すべきか分からない。また、私はこれを行うにはC + +を使用しています。マウスの選択に基づいてオブジェクトをドラッグするOpengl
0
A
答えて
2
2Dについては、私が働いているコードは次のとおりです。少し修正する必要がありますが、うまくいけばそれはあなたにいくつかのアイデアを与えるでしょう。このコードは、ワールド座標を「0高さ」にします。何かが高さが0でない場合、パースペクティブによっては正しく選択されないことがあります。
// for the current mouse position on the screen, where does that correspond to in the world?
glm::vec2 World::world_position_for_mouse(const glm::vec2 mouse_position,
const glm::mat4 projection_matrix,
const glm::mat4 view_matrix)
{
int window_width;
int window_height;
this->graphics.get_window_dimensions(window_width, window_height);
const int mouse_x = mouse_position[0];
const int mouse_y = mouse_position[1];
// normalize mouse position from window pixel space to between -1, 1
GLfloat normalized_mouse_x = (2.0f * mouse_x)/window_width - 1.0f;
float normalized_mouse_y = 1.0f - (2.0f * mouse_y)/window_height;
glm::vec3 normalized_mouse_vector = glm::vec3(normalized_mouse_x, normalized_mouse_y, 1.0f);
glm::vec4 ray_clip = glm::vec4(normalized_mouse_vector.xy(), -1.0, 1.0);
glm::vec4 ray_eye = glm::inverse(projection_matrix) * ray_clip;
ray_eye = glm::vec4(ray_eye.xy(), -1.0, 0.0);
glm::vec3 ray_world = (glm::inverse(view_matrix) * ray_eye).xyz();
ray_world = glm::normalize(ray_world);
float l = -(camera.z/ray_world.z);
return {camera.x + l * ray_world.x, camera.y + l * ray_world.y};
}
かかわらずズームの、私は上記のコードの結果に基づいて、このコードを使用するのと同じ「画面単位」で世界をパンに:
camera_motion
がどのようにちょうど乗数である
float camera_motion = time.get_wall_clock_delta() * camera_motion_per_second;
auto x1 = this->world_position_for_mouse(glm::vec2(1,0), this->cached_projection_matrix, this->cached_view_matrix).x;
auto x2 = this->world_position_for_mouse(glm::vec2(0,0), this->cached_projection_matrix, this->cached_view_matrix).x;
auto camera_change = (x1 - x2) * camera_motion;
速く、前のフレームからの時間デルタと組み合わせて動きたいと思っています。基本的にはズームインするほど速くなり、毎秒スクロールします。ウィンドウの右端にあるピクセルは、ズームに関係なく左端に到達するまでに一定の時間がかかります。
+0
コードを悪くしてくれてありがとうございます。 –
関連する問題
- 1. RAutomationマウスをドラッグしてテキストを選択
- 2. JComboBoxの選択に基づいて選択する方法
- 3. Linq:プロパティに基づいてオブジェクトを選択
- 4. フォームオプションボタンに基づいてケースを選択
- 5. テキストパターンに基づいて行を選択
- 6. Qt OpenGL-マウスクリックに基づいてオブジェクトを取得する方法
- 7. ajaxは別の選択に基づいて選択します
- 8. mysqlの行数を基準に基づいて選択する
- 9. 一連の基準に基づいてレコードを選択する
- 10. 他に基づいて選択してください選択
- 11. オブジェクトの値に基づいてGroupBoxのテンプレートを選択するには
- 12. ルックアップテーブルに基づいて選択
- 13. ng選択に基づいて返信
- 14. 基準に基づいて非連続セルを選択する
- 15. マウスでオブジェクトをドラッグする
- 16. 引数の量に基づいてオブジェクトのインスタンス化を選択するマクロ
- 17. ユーザーの選択に基づいてオブジェクト属性を表示する方法は?
- 18. Linqがコンテンツに基づいて2つのリストからオブジェクトを選択する
- 19. 選択ボックスの選択に基づいて入力フィールドを無効にする
- 20. 前の選択に基づいて次の選択ボックスを表示する
- 21. 別の選択の値に基づいて選択値を変更する
- 22. キー値のペアに基づいてjsonオブジェクトを選択してください
- 23. 別のデータフレームの基準に基づいて行を選択
- 24. Vue.js/Vuetify - 別の選択肢に基づいて選択データをフィルタリングする
- 25. HTML選択オプション値に基づいて別の要素を選択するCSS
- 26. sqlクエリは、条件に基づいて別の選択リストを選択する
- 27. ユーザーの選択に基づいて入力フィールドを表示する(選択)
- 28. 選択非表示の選択ボックスと選択ボックスオプションを選択に基づいて選択します。
- 29. MFCのプレス・ドラッグ・アクションではなく、マウス・クリックによる選択
- 30. データ属性の値に基づいてオプションを選択する
これはマウスピッキングと呼ばれ、複雑です。私はそれが働いているが、私はそれが働くまで私がこのサイトで見つけたものを使いこなした。そして私のものは3dではなく2dのためにしか働かない。 http://antongerdelan.net/opengl/raycasting.html基本的には、レンダリング時に画面の位置から自分の世界に戻って(あなたの世界からスクリーンまで)、あなたが行った方向から「後方に」光線を射しています。 。次に、それが交差するものを決定するために移動する際に、異なる「高さ」にある場所を把握します。私はこれを答えとして提出したいと思いますが、私はそのウェブサイトの近くにはどこにでも説明することができません。 – xaxxon
私は出発場所を与えてくれてありがとう、主に2dでうまくいくように探していますそれはそこの唯一のものだと思われるので、例です。 –
2dをやっているので、私は実際のコードを掲示しました。私はそれがどのように動作するかを正確にはわからないと認めています。もし問題があれば、私はそれらに答えることができないかもしれません。 – xaxxon