1

カーソルが指している角度(x、y、zベクトル)を知る必要があるだけです。だから私は私が指している方向にどんな粒子でも撃つことができます。

深度テストを使用できないため、一般的なピッキング方法はオプションではありません。

これは純粋数学だけで可能ですか?ビューポートのアスペクト比や遠近法などを知っている場合は?

編集:空のシーンから座標を取得する必要があります。完全に空で、描画はまったくありません!

4

4 に答える 4

2

簡単な答えは、シーンのレンダリングの一部には、世界座標をビュー座標に変換することが含まれるということです。基本的に、私の眼球に関連するものはすべてここにあります。

ビュープレーンは、マウスが置かれている画面です。マウスの座標が(xx、yy)の場合、ビューの座標ではおそらく(xx、yy、1)または(xx、yy、-1)のいずれかに配置されます。おそらく、(0、0)が画面上のビューポートの中心であるシステムを使用する必要があります。マウスの座標が通常どのように機能するかではありませんが、一定のオフセットは十分に簡単です。

zz = 0はプレーヤーがいる場所ですが、ビュープレーンは、プレーヤーと彼が見ることができるものとの間の短い距離です。そのため、ここではビュー平面が(xx、yy、1)または(xx、yy、-1)のいずれかとして扱われます-正のzを持つビュー座標を持つ+1(通常の場合だと思います)オブジェクトを使用する場合あなたの前にいます。

これをワールド座標に戻すには、ワールド座標をビュー座標に変換するのと同じ変換を適用しますが、逆方向に変換します。次に、世界座標でのマウスポインタの位置を取得します。方向ベクトルを取得するには、プレーヤーの位置を引きます。

逆変換は、各ステップで逆行列を使用し、ステップを逆に適用します。原則として、すべてのステップを1つの行列にまとめることができ、変換全体に対して逆行列を計算できますが、これは最善のアプローチではありません。たとえば、一般的な逆行列を計算するよりも、回転の逆行列を計算する方がはるかに簡単です。ワールド座標からビュー座標への変換が必要に応じてコンポーネント(位置、方向など)から構成されている場合、実際には、逆コンポーネントを計算してそれらを組み合わせるだけで済みます。左30度(世界からビューへ)の代わりに、右30度(ビューから世界へ)などを使用します。

運が良ければ、プレーヤーの位置の問題全体を完全に削除できる可能性があります-ビュースペースでのマウスポインタの角度を計算し(これにはオイラー角で十分です)、ビューの方向部分のみを適用します- -世界の変容。

いいえ、ここに公式はありません。申し訳ありませんが、ビューからワールドへの変換は、ワールドからビューへの変換の方法に依存しているため、また、簡単な例がないためです。

質問は異なりますが、ここの回答でいくつかの関連する参照を見つけることができます...

行列の乗算-ビュー/プロジェクション、ワールド/プロジェクションなど

于 2010-07-27T15:06:54.307 に答える
2

シーン全体がピラミッド内に収まり、目がピークにある(ベースに向かっている)と考える場合、画面はベースに平行な断面であり、その上にシーン全体が(2D空間に)投影されます。おそらく、画面の寸法と2D空間でのカーソルの位置を知っているはずです。

そのピラミッドをX側から見てから、もう一度Y側から見て、問題を2つの直角三角形に変えることができます。三角形の底辺は「目」から画面の中心までの線で定義され、斜辺は「目」からカーソルまでの線で定義されます。

2Dディスプレイの端にカーソルを置くと、角度(与えられた遠近法情報)がわかるので、「目」が2D投影面(または三角形の底辺の長さ)からどれだけ離れているかを判断できます。ピクセル単位。その長さと、三角形の反対側の長さ(カーソルのx座標またはy座標)を使用して、角度を決定できます。これはすべて、基本的なトリガーを使用します。

それが役立つ場合は、問題のすべての三角形を引き出します。

  • (0, 0);で定義される三角形。(base, 0); (base, Y_MAX)ここY_MAXで、はカーソルの最大値(画面の上端)です。 base = Y/tan(max_angle)
  • (0, 0);で定義される三角形。(base, 0); (base, X_MAX)
  • (0, 0);で定義される三角形。(base, 0); (base, Y)、ここYで、はカーソルのy位置です。 angle = (tan^(-1))(Y/base)
  • (0, 0);で定義される三角形。(base, 0); (base, X)
于 2010-07-27T15:08:20.563 に答える
1

gluUnProject

于 2010-07-27T16:36:06.983 に答える
0

選択した弾丸がある範囲で爆発しない限り(物までの距離が重要です)、角度を決定するために必要なのは、ボアサイトと平面との交点だけです。

カーソルを、視線方向に垂直で、少し離れた平面に置くように制限します。次に、砲身の出口の位置からカーソルの位置までの変位を取得し、そこから角度を計算します。

于 2010-07-27T15:06:10.360 に答える