問題タブ [mouse-picking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - OpenTK の「ピッキング」が意図したとおりに機能しない
ゲームに選択を実装しようとしましたが、選択した色が常に 255,255,255,255 または 255,0,0,0 のいずれかを返すため、何かが欠けていると確信しています。これら 2 つの色はランダムに発生するように見え、同じブロックを複数回クリックすると変化することさえあります。何が間違っていたのかわかりませんが、スタックオーバーフローの神々がこれに対する解決策を見つけるのを手伝ってくれることを本当に望んでいます.
出力を示す図を次に示します。
そして、これが私の GameClient クラスです: (乱雑なコードで申し訳ありません。まだ整理する時間がありません)
opengl - 3D ピッキング用のマウス座標から光線を作成する
私の質問
誰かが良い記事/チュートリアル/何かをリンクしたり、マウス座標からレイを正しくキャストして3Dでオブジェクトを選択する方法を説明したりできますか?
私はすでにレイと交差点の作品を持っています。今はマウスのクリックからレイを作成するだけです。
実際に機能するはずだとわかっているものが欲しいのですが、それが最初に正しいかどうかわからないものではなく、ここで専門家に尋ねる理由です.
現在の状態
原点と方向をカメラと同じに設定すると、実際に機能して交差を検出するレイクラスがあります。そのため、カメラを動かすと、実際に正しいものが選択されます。
カメラの動きではなく、実際にマウスで 3D ピッキングを行いたいと思います。
私は本当に苦手なので、これに関する他の多くの質問、2つのチュートリアル、特にさまざまな数学に関するものを読みました。
しかし、それはあまり役に立ちませんでした。なぜなら、そこの人々は、実際には廃止されているように見えるいくつかの「アンプロジェクト」機能をよく使用し、使用方法がわからず、アクセスできないからです。
現在、光線の原点をカメラの位置に設定し、このチュートリアルの計算から光線の方向を取得しようとしています。
そして、それは少し機能します。つまり、カメラがオブジェクトを指しているときに選択が機能し、時にはy軸全体に沿っても機能します。何が起こっているのかわかりません。
誰かが私のコードを今すぐ見たい場合:
opengl - 光線を作成する 2 つの gluUnproject 呼び出しでワールド座標でマウスを取得する
私は多くの人が良い方法を見つけているように見えるものを使用しようとします。異なる z 値で gluUnproject を 2 回呼び出してから、これら 2 つのベクトルから光線の方向ベクトルを計算しようとします。
私はこの質問を読み、そこにある構造を自分のコードに使用しようとしました:
しかし、これは均一なクリップ座標のみを返します(私は信じています)。これは、すべての軸で -1 から 1 の範囲しかないためです。
レイを作成できる座標を実際に取得するにはどうすればよいですか?
編集:これは私が行列を構築する方法です:
編集2:
これは、関数が現在どのように見えるかです:
}
私は独自の射影とビュー マトリックスを使用しようとしていますが、これは奇妙な結果しか得られないようです。
GlGet... を使用すると、右上隅をクリックすると次のようになります:
start: (0.97333336, -0.98, -1.0)
end: (0.97333336, -0.98, 1.0)
私が自分のものを使用すると、同じ位置にこれが得られ
ます
:
ビューマトリックスだけでなく、modelViewマトリックスが実際に必要ですが、すべてのオブジェクトの表示呼び出しごとに変更および作成されるため、取得方法がわかりません。
しかし、これは本当に問題ですか?このチュートリアルで彼は、「通常、目の空間からクリップ空間に入るには、ベクトルに射影行列を掛けます。この行列の逆数を掛けることで、逆方向に進むことができます」と述べています。次のステップで、彼は再びビュー行列の逆数を掛けるので、これが実際にすべきことだと思いましたか?
編集3:
ここで、user42813が提案したことを試しました:
ただし、方向と原点の値は常に同じです:
origin: (-0.04557252, -0.0020000197, -0.9989586)
direction: (-0.04557252, -0.0020000197, -0.9989586)
c++ - 回転が関係している場合に OpenGL でマウス座標をモデル座標に変換する
Qt フォーラムでこの質問を見つけ、好奇心を刺激しました。
Qt で立方体を表示する非常に単純な例を見つけ、立方体のロジックを変更して、辺の長さが 1 単位の立方体を作成しました。
次に、モデルをクリックして、クリックした領域の座標を表示しようとしました。
回転が関係していない場合、ピッキングはうまく機能しているようです。しかし!ローテーション (またはその 1 つ) のコメントを外すpaintGL
と、「間違った」値になってしまいます。
例えば:
- 回転せず、立方体のほぼ左端の境界をクリックします。
gluUnProject
メソッドは、ポイントをクリックしたことを示していますが{ -0.49075, 0.234, 0.5 }
、これは問題ないようです。
- 回転を有効にして、立方体の最も左端の境界をクリックします: ポイントを受け取りましたが
{ -0.501456, 0.157555, -0.482942 }
、これは間違っているようです。x
座標が の範囲から外れています-0.5, 0.5
。
座標変換は大丈夫だと思います。私は Google を通じて調査してきましたが、人々は常に同じコードを使用しています。また、ピクセルの色情報は、クリックした顔の色と一致します。
では、回転が関係しているときに座標が間違っている理由を誰か教えてもらえますか? 基本的な 3D の理解に失敗していると思いますが、それがどこにあるのかわかりません。
コードは次のとおりです。
main.cpp:
GLCube.h
GLCube.cpp:
ノート:
これを Windows 8.1 64 ビット、Qt 4.8、および MinGW で実行しています。
また、両方ともエラーなしglReadPixels
でgluUnProject
終了します (ERROR CODE = GL_NO_ERROR
)
そしてglut
利用できません。OpenGL
、QtOpenGL
および/またはglu
提供するもののみ。
c - ピッキング時に常にズームインするのはなぜですか? (OpenGL)
次のコードがあります。
長々とすみません。一度に 1 つのオブジェクトを選択して操作できるように、ピッキングを機能させようとしています。私の印刷物によると、1 つのハードルを除いて、期待どおりに機能しています。コードをくまなく調べ、いくつかの変更/デバッグ作業を行いましたが、問題の行が見つかりません。ピッキングがこの奇妙な動作をする理由について、誰かが私を正しい方向に向けることができますか?
c# - GLControl ピッキングの問題
私は、OpenGL/OpenTK での選択に少し問題があります。今回は、しばらく前に開始したスレッドとは異なり、実際に機能しています。唯一の問題は、「タイル」が正しく選択されていないことです。つまり、グリッド上の場所をクリックすると、そのすぐ隣のグリッド タイルが選択されるということです。ただし、マウスを少し動かすと、グリッド タイルが正しく選択されます。説明するのはかなり難しいので、2 つの画像、コード、および実行可能ファイル自体をアップロードします。
私の見解は次のようになります。
これは基本的なグリッド選択システムです。そして、それは機能します。ただし、選択ルーチンは少しずれているようです。
これは下にあるビューの写真ですが、実際にはユーザーには表示されません。これは、ユーザーがクリックしたときにバックバッファーに描画されるシーンです。これは、ピッキング システムが実際にどのように見えるかを明らかにするのに役立ちます。
赤い円と x は、クリックしたばかりの場所を示していますが、正しく登録されていません。その場所のコレクションにボクセルが追加されていませんでした。ただし、マウスを少し右に動かすか、タイルの中心に近づけると、その位置にボクセルが正しく追加されます。
コードの大部分は次のとおりです。他に必要と思われるものを追加します。ああ、散らかっていてすみません。片付ける時間がありませんでした。
そして、ここに実行ファイル自体のダウンロード リンクがあります。これにより、あいまいで不十分な口頭での説明ではなく、直接問題を確認できるようになります。
編集/更新
私はちょうど問題を発見したと思います。コントロール自体は、サイズ変更中に返されます (幅 518、高さ 537)。ただし、GIMP でこれを測定したところ、(518,512) の視覚領域しか得られないことがわかりました。これは、コントロールが隣接するツールストリップと下のディスプレイストリップ コントロールによって部分的に覆われていることを意味します。これが事実だと考えて、ピッキングルーチンの y 値を -25 (コントロールの 1 つの高さ) オフセットしようとしたところ、魔法のようにうまく機能し始めました。これで実際に問題が解決すると思います。コントロールをより適切に配置し、opengl コンテキストを前面に表示する必要があるだけです。これで修正されるはずです。その場合は、すぐに以下の回答を提供します。
c++ - OpenGL は、現在のマウスの場所に最も近い世界の 3D ポイントの 3D 座標を取得します。
OpenGL コンテキストでは、マウス座標を 3D ワールド座標に変換できることを確認しました (たとえば、Opengl を使用した MFC は、マウスの 2D 座標から 3D 座標を取得します)。ただし、単に s のセットと空のスペースがたくさんある場合、これは機能しませんGLPoint
。空のスペースにマウスを置いている場合、3D 座標は意味を持ちません。
マウスの位置に最も近い 3D ポイントの座標を取得するにはどうすればよいですか?