我正在创建一个360°图像播放器使用Oculus裂谷SDK。场景由一个立方体组成,摄像机摆在它的中心,有可能绕着偏航、俯仰和滚动旋转。
我用openGL绘制了对象,考虑了每个立方体的脸的二维纹理,从而产生了360°的效果。我想要找到的部分,在原来的纹理,是实际显示在Oculus视口在某一时刻。
到目前为止,我的方法是使用欧拉角来找出视口的一些重要点(即中心点和角)的一个近似像素位置,以识别原始纹理中的一些区域。
考虑到使用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");
}发布于 2016-04-01 15:16:09
通过将相机姿态四元数传递给OVR::matrix 4构造函数,您可以得到一个完整的旋转矩阵。
您可以采取任何2D位置的眼睛视口,并将其转换为其相机空间的三维坐标,使用fovPort晒角。规范化它,你得到这个像素在相机空间中的方向矢量。
如果你把早些时候得到的旋转矩阵应用到这个方向向量中,你就会得到射线的实际方向。
现在你必须转换从这个方向到你的纹理UV。方向向量中绝对值最高的分量会给出它所看到的立方体的面。其余的组件可以用来在纹理上找到实际的2D位置。这取决于你的立方体面是如何定向的,如果它们是x翻转的,等等。
如果你是在渲染部分的观众,你会想要这样做的着色器。如果这是为了找到用户在原始图像中看到的位置或其视场的范围,那么就像您所写的那样,只有少量的光线就足够了。
编辑
这里有一些代码,从棕褐色的角度到相机的空间坐标。
float u = (x / eyeWidth) * (leftTan + rightTan) - leftTan;
float v = (y / eyeHeight) * (upTan + downTan) - upTan;
float w = 1.0f;x和y为像素坐标,eyeWidth和eyeHeight为眼缓冲大小,*Tan变量为fovPort值。我首先将像素坐标表示为0..1范围,然后用总晒黑角对方向进行缩放,然后再重新输入。
https://stackoverflow.com/questions/36358678
复制相似问题