3

ウィンドウに長方形があり、長方形の領域を定義して、この長方形をクリックできるようにしようとしています。

マウス クリックがこの領域内にある場合、それはクリックです。

例: ウィンドウ上で、長方形の頂点が次のようになっていると仮定します:
x = 40, y = 50; width = 200, height = 100;
したがって、次の場合にクリックがカウントされます
(mouseXPos > getX()) && (mousxPos < (getX()+width)) && (mouseYPos > getY()) && (mouseYPos > getY()+height)

今、関数を持つクラスを継承して、オブジェクトにlookAt変換を行っていlookAtます。また、カメラを使用して、オブジェクトのさまざまな面を確認しています (カメラの回転)。そのため、オブジェクトがさまざまな軸に沿って回転し、カメラを使用するとさまざまな面が表示されます。

しかし、オブジェクトが移動すると、長方形の頂点が変わると思っていたでしょう。長方形の頂点も関数の実行時に変更されているはずgluLookAtですが、そうではないように見え、オブジェクトが存在しないにもかかわらず、クリック領域は常にそれらのポイントで静止したままです。どうすればこの問題に取り組むことができますか? オブジェクトをクリック可能にしてマウスイベントを追加するにはどうすればよいですか?

4

3 に答える 3

0

ID バッファーの代替案に賛成です。私はそれを数回使用しましたが、それは本当に正しいことでした: 高価なジオメトリの選択はなく、基礎となるジオメトリとの完全な切断はほとんどありません.

それでも、最も近いジオメトリ (画面上で「見える」ジオメトリ) しか選択できず、後ろに隠れている可能性のあるモデルは選択できません。半透明のマテリアルを扱う場合にも同じ問題が発生します。

1 つの解決策として、RGBA ID テクスチャで 4 つのオブジェクトをレンダリングすることで ID ピーリングを行うことが考えられます (最適ではない可能性があると感じていますが、試してみる価値はあります)。

于 2012-12-31T04:29:29.183 に答える
0

他に誰も答えていないので、試してみます。:)

opengl の経験はあまりありませんが、これは予想される動作のように思えます。ワールド座標と画面上の座標を混同しているようです。

このように考えてみてください。リビング ルームのテーブルを 2 つの異なる角度から撮影すると、見た目は異なりますが、両方の画像でその部屋の同じスペースを占めることになります。同じことは、opengl を使用する場合のエンティティについても言えます。カメラを動かしても、エンティティの座標は変化せず、エンティティの認識だけが変わります。

さて、私が間違っていなければ、opengl で適用されるのと同じ変換を適用することで、ワールド座標を画面上の座標に変換できます。これを見ることをお勧めします: OpenGL: マウス クリックをジオメトリに投影する

于 2012-12-30T13:50:12.313 に答える
0

3D 形状をクリックしようとしていて、カメラを動かしている場合、私はこれを画面座標でチェックしません。

代わりに、ユーザーがクリックしたポイントを 3D 空間の線に投影し、クリックできるオブジェクトに対してそれを交差させることができます。

GL には、このための機能があります。gluUnproject()

その関数にビューの詳細と、クリックされたスクリーン ポイントを指定すると、ユーザーが 3D 空間のどこでクリックしたかがわかります。ニア プレーンとファー プレーンの両方でポイントをチェックすると、これらのポイント間のラインをオブジェクトに対してチェックできます。

もう 1 つの方法は、ある種の ID バッファーです。この場合、シーンを画面外にレンダリングしますが、シェーディングされたピクセルを出力する代わりに、各オブジェクトの ID 値を出力します。ヒットテストは、そのバッファからピクセルを読み取るだけの問題です。

于 2012-12-30T14:09:41.577 に答える