2016-04-01 2 views
1

Oculus rift SDKを使用して360°イメージプレーヤを作成しています。 シーンは立方体で構成され、カメラはその中央に配置され、ヨー、ピッチ、ロールの周りを回転する可能性があります。キューブのテクスチャ領域を現在のOculusビューポートに関連付ける

私は、360°エフェクトを作成するために各キューブの顔の2Dテクスチャを考慮して、OpenGLを使用してオブジェクトを描画しました。 私は、ある瞬間にOculusビューポートに実際に表示されている元のテクスチャの部分を探したいと思います。今のところ私のアプローチは、元のテクスチャ内のいくつかの領域を識別するために、オイラー角を使用してビューポートのある重要点(すなわち、中心点およびコーナー)のおおよその画素位置を見出そうとしていた。

オイラー角を使用することのすべての問題を考慮して、それを行う最も賢い方法ではないようです。

これを達成するための方法はありますか?

編集


私はレンダリングループ内でrunnedすることができ、小さな例をした:

 //Keep the Orientation from Oculus (Point 1) 
     OVR::Matrix4f rotation = Matrix4f(hmdState.HeadPose.ThePose); 

     //Find the vector respect to a certain point in the viewport, in this case the center (Point 2) 
     FovPort fov_viewport = FovPort::CreateFromRadians(hmdDesc.CameraFrustumHFovInRadians, hmdDesc.CameraFrustumVFovInRadians); 
     Vector2f temp2f = fov_viewport.TanAngleToRendertargetNDC(Vector2f(0.0,0.0));// this values are the tangent in the center 
     Vector3f vector_view = Vector3f(temp2f.x, temp2f.y, -1.0);// just add the third component , where is oriented 
     vector_view.Normalize(); 

     //Apply the rotation (Point 3) 
     Vector3f final_vect = rotation.Transform(vector_view);//seems the right operation. 


     //An example to check if we are looking at the front face (Partial point 4) 
     if (abs(final_vect.z) > abs(final_vect.x) && abs(final_vect.z) > abs(final_vect.y) && final_vect.z <0){ 
      system("pause"); 
     } 
  1. は、右のビューポート全体を考慮することですかのために行われるべきですそれぞれの単一の目?
  2. ビューポートの中心点と異なる点をどのように指定できますか? TanAngleToRendertargetNDC()の入力値をどの値にするべきかはわかりません。

答えて

1

あなたがカメラを渡すことで、完全な回転行列を取得することができますがOVR :: Matrix4コンストラクタにクォータニオンをもたらします。

アイビューポートで任意の2D位置を取得し、fovPortタン角を使用してカメラ空間の3D座標に変換できます。これを正規化し、このピクセルのカメラ空間で方向ベクトルを取得します。

この方向ベクトルに先に取得した回転行列を適用すると、そのレイの実際の方向が得られます。

この方向からテクスチャUVに変換する必要があります。方向ベクトルの絶対値が最も高いコンポーネントは、それが見ている立方体の面を与えます。残りのコンポーネントを使用して、テクスチャ上の実際の2D位置を見つけることができます。これは、キューブの向きがどのように向いているか、xフリップされているかなどによって異なります。

ビューアのレンダリング部分にいる場合は、シェーダで行います。これが、元の画像や視野の範囲でユーザーがどこを見ているのかを見つけることであれば、あなたが書いたように、一握りの光線で十分です。

編集ここ

は、コードのビットは、カメラ空間座標に日焼け角度から行くことです。

float u = (x/eyeWidth) * (leftTan + rightTan) - leftTan; 
float v = (y/eyeHeight) * (upTan + downTan) - upTan; 
float w = 1.0f; 

xyは画素座標であり、eyeWidtheyeHeight眼バッファサイズであり、そして*タン変数はfovPort値です。まず[0..1]の範囲のピクセル座標を表現し、それを方向の全タン角でスケーリングし、次に再センタリングします。

+0

まずはお返事ありがとうございます。 私は、最初の点は次のように解決できると思います: OVR :: Matrix4f rotation = Matrix4f(hmdState.HeadPose.ThePose); 2番目の点については、特定の2D位置のFovPortから3Dベクトルへの変換関数を見つけることができません。自分で実装する必要があるかもしれません。これまでは、関数CreateFromRadians()を使ってFovPortを作成しました。 – Pelux

+0

@ Pelux:姿勢全体をMatrix4fコンストラクタに渡すと、位置データも取得されます。あなたが回転をしたいだけなら、あなたは姿勢回転コンポーネント(四元数)を渡すべきです。 Re:FovPort、はい、それを実装する必要があります。 FovPort tan angleの値が何を表しているかを理解すれば、それはかなり簡単です。 –

+0

@Pelux:コードスニペットで自分の答えを編集しました。 –

関連する問題