我正在为谷歌纸板开发一个应用程序,它将流式传输两个视频,每个视频一个,以模拟3D视觉。我只打算使用google vr sdk来模拟将应用于每个帧的双目失真,但是this example哪个函数实际应用失真还不清楚。
/**
* Draws a frame for an eye.
*
* @param eye The eye to render. Includes all required transformations.
*/
@Override
public void onDrawEye(Eye eye) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
...
// Apply the eye transformation to the camera.
Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0);
// Set the position of the light
Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0);
// Build the ModelView and ModelViewProjection matrices
// for calculating cube position and light.
float[] perspective = eye.getPerspective(Z_NEAR, Z_FAR);
Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0);
Matrix.multiplyMM(mModelViewProjection, 0, perspective, 0, mModelView, 0);
drawCube();
// Draw the rest of the scene.
...
}
此代码段的描述如下:
这是一系列事件:
- 宝藏进入了眼睛空间。
- 我们应用投影矩阵。这提供了为指定眼睛渲染的场景。
- Google VR SDK会自动应用失真,以渲染最终场景。
然而,实际上没有解释第三步。由于我不是渲染和图像,只是使用现实生活中的视频,我只需要使用应用失真的部分代码,但是我不清楚这究竟是怎么发生的。
如果有任何想法,请告诉我。
答案 0 :(得分:0)
public Distortion getApproximateInverseDistortion(float maxRadius,int numCoefficients)
使用最小二乘拟合系数构建反扭曲对象。
这是为了实现应用程序端自定义失真。在返回的对象上使用.getCoefficients()来检索逆失真函数的系数。
这是近似的逆,并且在返回的对象上使用.distort()将比在原始对象上使用distortInverse()方法更快但不太准确。对于有用的结果,输入失真必须在0..maxRadius范围内表现良好。
50度半角FOV(总共100度)的示例,这将产生反向失真,其中inverse.distort(r)近似等于在r = 0 ... maxFovHalfAngle范围内的distortion.distortInverse(r)。< / p>
更多信息:https://developers.google.com/vr/android/reference/com/google/vr/sdk/base/Distortion
https://www.baekdal.com/insights/why-pretty-much-all-360-vr-videos-get-it-wrong