使用当前Oculus视口

时间:2016-04-01 14:17:40

标签: c++ opengl oculus

我正在使用Oculus rift SDK创建一个360°图像播放器。 场景由立方体组成,摄像机位于其中心,可以围绕偏航,俯仰和滚动旋转。

我使用openGL绘制了对象,考虑到每个立方体面部的2D纹理以创建360°效果。 我希望在某个瞬间找到Oculus视口中实际显示的原始纹理中的部分。

到目前为止,我的方法是尝试使用欧拉角找到视口的某个重要点(即中心点和角点)的近似像素位置,以便识别原始纹理中的某些区域。 / p>

考虑使用Euler Angles的所有问题,似乎不是最明智的方法。

有没有更好的方法来实现它?

修改

我做了一个可以在渲染循环中运行的小例子:

       //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 个答案:

答案 0 :(得分:1)

您可以通过将相机姿势四元数传递给OVR :: Matrix4构造函数来获得完整的旋转矩阵。

您可以在眼睛视口中拍摄任何2D位置,并使用fovPort tan角度将其转换为相机空间3D坐标。将其标准化,然后在此像素的相机空间中获得方向向量。

如果将之前获得的旋转矩阵应用于此方向向量,则可以获得该光线的实际方向。

现在你必须从这个方向转换为纹理UV。方向矢量中具有最高绝对值的组件将为您提供它正在查看的立方体的面。其余组件可用于查找纹理上的实际2D位置。这取决于您的立方体面如何定向,如果它们是x翻转等等。

如果您处于查看器的渲染部分,则需要在着色器中执行此操作。如果要查找用户在原始图像中查看的位置或其视野的范围,那么只有少量光线就足够了。

修改

这是从tan角度到相机空间坐标的一些代码。

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

xy是像素坐标,eyeWidtheyeHeight是眼睛缓冲区大小,* Tan变量是fovPort值。我首先在[0..1]范围内表示像素坐标,然后按方向的总棕褐色角度进行缩放,然后重新定位。