2012-01-23 22 views
3

私はタッチスクリーンをクリックし、ピッキングに使用するレイの開始座標としてタッチしたポイントを使用したいと考えています。タッチスクリーンの座標を3次元に変換する

私はGLワールド座標で使用できるものに画面に触れることから返されたポイントをどのように変換するのですか?

検索では、gluUnProjectを使用して、それがサポートされているかどうか、どのように移植するかなどの多くのレポートが含まれています。

誰かが私のためにまっすぐそれをレイアウトすることはできますか?

私はObjective C、Xcodeを使用しています。私はiphone用にコンパイルしています。

答えて

3

ステップ0:ゲットgluUnproject:それを必要とする

レポートは真です。その機能はあなたのためにすべての重い持ち上げを行います。ある時点で、MESAプロジェクトには、修正なしにiOS上でほぼ完全に機能する実装があることがわかりました。まだ利用可能かどうかはわかりません。それを除いて、あなたはそれについて何らかの研究をしなければならず、自分自身を動かすか、他の誰かを砲撃しなければならない。線形代数はちょっと重いので、幸運です。

ステップ1:のUIKitへ変換OpenGLの座標に座標:

これは、通常、二つのことを含む:UIKitの左上にその起源を好きなので

  1. は、Y座標フリップ、 OpenGLは左下に原点があります。

    touchLocation.y = [[self view] bounds].size.height - touchLocation.y; 
    
  2. 「スクリーンユニット」をピクセルに変換します。これにより、標準および網膜ディスプレイ装置間で物事が一貫して維持されます。

    CGFloat scale = [[UIScreen mainScreen] scale]; 
    touchLocation.y *= scale; 
    touchLocation.y *= scale; 
    

ステップ3:使用gluUnprojectあなたの変換後の座標:

gluUnproject()は技術的にはワールド空間内の3Dポイントに窓空間の3次元のポイントに変換します。したがって、レイを取得するには、それを2回呼び出す必要があります.1回はニアクリッピングプレーン、もう1回はfarクリッピングプレーンです。それはあなたにレイを得ることができる2つのポイントを与えるでしょう。 gluUnproject()を呼び出すには、2Dビュー座標、現在のOpenGLビューポート、現在のOpenGLモデルビュー行列、および現在のOpenGL投影行列にアクセスする必要があります。擬似コード:

Vector3 near, far; 
gluUnProject(touchLocation.x, touchLocation.y, 0, _modelview, _projection, _viewport, &near.x, &near.y, &near.z); 
gluUnProject(touchLocation.x, touchLocation.y, 1, _modelview, _projection, _viewport, &far.x, &far.y, &far.z); 
return MakeRay(near, Vector3Subtract(far, near)); 
+0

私は今、gluUnprojectを実装しました。あなたの擬似コードでは、ステップ1の後にタッチ座標が表示されますか?レイの遠点が遠くから計算されているのはなぜですか? – Dave

+0

@Daveはい、viewportcoordはビューポートのタップ位置です。わかりやすくするためにコードを編集しました。数学的には、光線はベクトルの原点と原点からのベクトルの方向として定義されます。したがって、「遠方の点」は絶対点ではなく、近い点から遠い点までを指し、遠い点として計算されます。 –

+0

私のソリューションは完璧ではありませんが、私はそれがレイ座標よりもレイ衝突の方程式と関係があると思います。途中でmake rayを説明してくれてありがとう。 – Dave

関連する問題