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");
}
- は、右のビューポート全体を考慮することですかのために行われるべきですそれぞれの単一の目?
- ビューポートの中心点と異なる点をどのように指定できますか? TanAngleToRendertargetNDC()の入力値をどの値にするべきかはわかりません。
まずはお返事ありがとうございます。 私は、最初の点は次のように解決できると思います: OVR :: Matrix4f rotation = Matrix4f(hmdState.HeadPose.ThePose); 2番目の点については、特定の2D位置のFovPortから3Dベクトルへの変換関数を見つけることができません。自分で実装する必要があるかもしれません。これまでは、関数CreateFromRadians()を使ってFovPortを作成しました。 – Pelux
@ Pelux:姿勢全体をMatrix4fコンストラクタに渡すと、位置データも取得されます。あなたが回転をしたいだけなら、あなたは姿勢回転コンポーネント(四元数)を渡すべきです。 Re:FovPort、はい、それを実装する必要があります。 FovPort tan angleの値が何を表しているかを理解すれば、それはかなり簡単です。 –
@Pelux:コードスニペットで自分の答えを編集しました。 –