5

iPhone eの画面から世界への問題

EAGLView でレンダリングされた 3D モデル (CUBE) があり、立方体の特定の面の中心に (任意の方向角度から) 触れていることを検出できるようにしたいと考えています。とても簡単に聞こえますが、そうではありません...

問題:
スクリーン座標 (タッチ ポイント) をワールド座標 (OpenGL 3D 空間内の位置) に正確に関連付けるにはどうすればよいですか? 確かに、特定のポイントを画面/ワールド軸の「パーセンテージ」に変換することは論理的な解決策のように思えるかもしれませんが、3D 空間をズームまたは回転する必要がある場合に問題が発生します。注: 3D 空間を回転およびズームインおよびズームアウトすると、2D 画面座標と 3D 世界座標との関係が変化します...また、視点と 3D 空間内のオブジェクトとの間の「距離」を考慮する必要があります。 . 最初は、これは「簡単な作業」のように思えるかもしれませんが、実際に要件を調べると、それは変わります。また、iPhone でこれを行っている例は見つかりませんでした。これは通常どのように行われますか?

「簡単な」タスク?:
確かに、画面と世界の間の仲介者として機能する API を作成するタスクを引き受けるかもしれませんが、そのようなフレームワークを作成するタスクには、本格的な設計が必要であり、「時間」がかかる可能性があります。 to do -- 4 時間で1 人でできることではありません...そして 4 時間がたまたま私の締め切りです。

質問:

  • iPhone OpenGL ES ワールドの 3D 空間で特定の場所に触れたかどうかを知る最も簡単な方法は何ですか?
4

5 に答える 5

7

gluUnProjecthttp://code.google.com/p/iphone-glu/にあります。私は iphone-glu プロジェクトとは関係がなく、まだ自分で試していません。リンクを共有したかっただけです。

そのような機能をどのように使用しますか?この PDFには、次のことが記載されています。

ユーティリティ ライブラリ ルーチンgluUnProject()は、この変換の反転を実行します。場所の 3 次元ウィンドウ座標とそれらに影響を与えたすべての変換が与えられると、gluUnProject() はそれが発生した場所から世界座標を返します。

int gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz, 
const GLdouble modelMatrix[16], const GLdouble projMatrix[16], 
const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz);

指定されたウィンドウ座標 (winx、winy、winz) を、モデル ビュー マトリックス (modelMatrix)、射影マトリックス (projMatrix)、およびビューポート (viewport) によって定義された変換を使用して、オブジェクト座標にマップします。結果のオブジェクト座標は、objx、objy、および objz で返されます。この関数は、成功を示すGL_TRUE、または失敗を示すGL_FALSE (非可逆行列など) を返します。この操作は、座標をビューポートにクリップしたり、glDepthRange()の外側にある深度値を削除したりしません。

変換プロセスを元に戻そうとすることには固有の困難があります。2 次元の画面位置は、3 次元空間のライン全体のどこからでも発生する可能性があります。結果を明確にするために、gluUnProject() は、ウィンドウの深さ座標 (winz) が提供され、その winz が glDepthRange() に関して指定されることを必要とします。glDepthRange() のデフォルト値の場合、winz が 0.0 の場合、近いクリッピング プレーンで変換されたポイントのワールド座標が要求され、winz が 1.0 の場合は、遠いクリッピング プレーンでポイントが要求されます。

例 3-8 (再びPDFを参照) は、マウスの位置を読み取り、変換元のニア クリッピング プレーンとファー クリッピング プレーンで 3 次元ポイントを決定することによって、gluUnProject() を示しています。計算されたワールド座標は標準出力に出力されますが、レンダリングされたウィンドウ自体はただの黒です。

パフォーマンスに関しては、gluUnProject を使用してやりたくないことの例として、Google を介してこれをすぐに見つけまし。私はまだ OpenGL ES の初心者なので、iPhone にどのように適用できるかはまったくわかりません。1ヶ月後にもう一度聞いてください。;-)

于 2009-12-15T07:54:45.643 に答える
2


視聴者の目から画面のタッチ ポイントを通って 3D モデル空間に 伸びる線を想像してください。

その線が立方体のいずれかの面と交差する場合、ユーザーは立方体に触れたことになります。

于 2009-07-02T08:23:23.147 に答える
1

2 つのソリューションが提示されます。どちらも、手段は異なりますが、最終目標を達成する必要があります。「マウスの下にあるワールド座標は?」という質問に答えるのではなく、「マウスの下にレンダリングされるオブジェクトは?」という質問に答えます。

1 つは、単純化されたバージョンのモデルをオフスクリーン バッファーに描画し、各面の中心を個別の色を使用してレンダリングすることです (色が同じように維持されるように照明を調整します)。次に、バッファー内のそれらの色を検出し (ピックスマップなど)、マウスの位置をそれらにマップできます。

もう 1 つは、OpenGL ピッキングを使用することです。ここに見栄えの良いチュートリアルがあります。基本的な考え方は、OpenGL を選択モードにし、ビューポートを関心のあるポイントの周りの小さな (おそらく 3x3 または 5x5) ウィンドウに制限してから、OpenGL の「名前」(整数識別子) を使用して、各面を構成するコンポーネントを識別します。このプロセスの最後に、OpenGL は、選択ビューポートでレンダリングされた名前のリストを提供できます。これらの識別子を元のオブジェクトにマッピングすると、マウス カーソルの下にあるオブジェクトを特定できます。

于 2009-07-11T16:11:20.023 に答える
0

opengl screen to worldの Google (たとえば、 GameDev.netで、あなたが探していることを誰かがまさにやりたいと思っているスレッドがあります)。これを正確に行うgluUnProject関数がありますが、iPhone では使用できないため、移植する必要があります ( Mesa プロジェクトのこのソースを参照してください)。それとも、公開されているソースがすでにどこかにあるのでしょうか?

于 2009-07-02T06:44:13.873 に答える