3

GLKitを使用してシンプルな3Dワールドを作成しました。画面のタップに基づいて、3Dの世界で特定のポイントを見つけようとしています。GLKMathUnprojectを使いたいようです。メソッドのシグネチャは次のとおりです。

GLKVector3 GLKMathUnproject (
   GLKVector3 window,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport,
   bool *success
);

いくつかのことが、必要なパラメータについて私を混乱させます。まず、ウィンドウの座標をGLKVector2にするべきではありませんか?そして最も重要なのは、画面上のポイントを3D空間に投影しないことで、単一のポイントではなく光線を作成することです。3D空間のポイントを2Dプレーン(別名スクリーン)に投影すると、そのポイントに関する情報の1次元が失われます。では、ポイントを「投影解除」する深さを指定せずに、2Dスクリーンポイントを3Dワールドポイントに変換するにはどうすればよいでしょうか。この方法については、インターネット上のどこにもコメントはありません(アップルドキュメントを除く)。

4

2 に答える 2

6

最初のパラメーターは GLKVector3 です。これは、z コンポーネントが目的の z 深度を格納するためです。

したがって、ウィンドウ x、y は画面座標であり、ウィンドウ z は目的の深さです。

たとえば、z=0 の場合、GLKMathUnproject は z=1 のニア プレーンでのオブジェクトの座標を提供し、GLKMathUnproject はファー プレーンでのオブジェクトの座標を提供します。

これが必要なのは、GLKMathUnproject が投影錐台によって形成される 3D 空間内の平面から線にマッピングされるためです。錐台の z 境界は、近平面と遠平面によって制約されます。

たとえば、投影されていないマウス ポイントを錐台の z=0 (オブジェクト空間) 平面にマッピングするとします。

次に、ウィンドウ z=0 およびウィンドウ z =1 1 で 2 点を非投影にします。これらの点を使用して、オブジェクト空間で線を形成します。この線を平面 z=0 と交差させて、最終的なターゲット ポイントを決定します。

これが誰かを助けることを願っています -

こちらで詳細を読むことができます。CasualDistraction ブログ

于 2012-08-18T04:48:17.087 に答える
0

あなたは「視線」を持っていますが、深さを知りません。次に、テストする各オブジェクトと同じ深さに到達するために、このベクトルをどれだけスケーリングする必要があるかを計算します。これを行ったら、拡張されたベクトルが実際にターゲット オブジェクトの妥当な範囲内で終了することを確認します。「レイキャスティング」といいます。

于 2012-06-15T21:35:31.320 に答える