首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将立方体的纹理区域与当前的Oculus视图关联起来

将立方体的纹理区域与当前的Oculus视图关联起来
EN

Stack Overflow用户
提问于 2016-04-01 14:17:39
回答 1查看 161关注 0票数 1

我正在创建一个360°图像播放器使用Oculus裂谷SDK。场景由一个立方体组成,摄像机摆在它的中心,有可能绕着偏航、俯仰和滚动旋转。

我用openGL绘制了对象,考虑了每个立方体的脸的二维纹理,从而产生了360°的效果。我想要找到的部分,在原来的纹理,是实际显示在Oculus视口在某一时刻。

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

考虑到使用Euler Angles的所有问题,不要认为这是最聪明的方法。

是否有更好的方法来实现这一目标?

编辑

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

代码语言:javascript
复制
       //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()的输入。
EN

回答 1

Stack Overflow用户

发布于 2016-04-01 15:16:09

通过将相机姿态四元数传递给OVR::matrix 4构造函数,您可以得到一个完整的旋转矩阵。

您可以采取任何2D位置的眼睛视口,并将其转换为其相机空间的三维坐标,使用fovPort晒角。规范化它,你得到这个像素在相机空间中的方向矢量。

如果你把早些时候得到的旋转矩阵应用到这个方向向量中,你就会得到射线的实际方向。

现在你必须转换从这个方向到你的纹理UV。方向向量中绝对值最高的分量会给出它所看到的立方体的面。其余的组件可以用来在纹理上找到实际的2D位置。这取决于你的立方体面是如何定向的,如果它们是x翻转的,等等。

如果你是在渲染部分的观众,你会想要这样做的着色器。如果这是为了找到用户在原始图像中看到的位置或其视场的范围,那么就像您所写的那样,只有少量的光线就足够了。

编辑

这里有一些代码,从棕褐色的角度到相机的空间坐标。

代码语言:javascript
复制
float u = (x / eyeWidth) * (leftTan + rightTan) - leftTan;
float v = (y / eyeHeight) * (upTan + downTan) - upTan;
float w = 1.0f;

xy为像素坐标,eyeWidtheyeHeight为眼缓冲大小,*Tan变量为fovPort值。我首先将像素坐标表示为0..1范围,然后用总晒黑角对方向进行缩放,然后再重新输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36358678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档