通过谷歌cardboard example看,我想知道头部运动转换发生在哪里,以便采用场景或视图来反映头部运动。

有趣的方法应该是public void onNewFrame(HeadTransform headTransform)类中的public void onDrawEye(Eye eye)MainActivity
这是一个片段:

@Override
public void onNewFrame(HeadTransform headTransform) {
   // Build the Model part of the ModelView matrix.
   Matrix.rotateM(modelCube, 0, TIME_DELTA, 0.5f, 0.5f, 1.0f);

   // Build the camera matrix and apply it to the ModelView.
   Matrix.setLookAtM(camera, 0, 0.0f, 0.0f, CAMERA_Z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

   headTransform.getHeadView(headView, 0);

   // Update the 3d audio engine with the most recent head rotation.
   headTransform.getQuaternion(headRotation, 0);
   cardboardAudioEngine.setHeadRotation(
    headRotation[0], headRotation[1], headRotation[2], headRotation[3]);

   checkGLError("onReadyToDraw");
}

@Override
public void onDrawEye(Eye eye) {
   GLES20.glEnable(GLES20.GL_DEPTH_TEST);
   GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

   checkGLError("colorParam");

   // Apply the eye transformation to the camera.
   Matrix.multiplyMM(view, 0, eye.getEyeView(), 0, camera, 0);

   // Set the position of the light
   Matrix.multiplyMV(lightPosInEyeSpace, 0, view, 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(modelView, 0, view, 0, modelCube, 0);
   Matrix.multiplyMM(modelViewProjection, 0, perspective, 0, modelView, 0);
   drawCube();

   // Set modelView for the floor, so we draw floor in the correct location
   Matrix.multiplyMM(modelView, 0, view, 0, modelFloor, 0);
   Matrix.multiplyMM(modelViewProjection, 0, perspective, 0, modelView, 0);
   drawFloor();


}

我的第一个假设是,根据来自onNewFrame()的数据在headTransform中修改了模型(或相机)。但是似乎并非如此,因为只有两次访问。一个用于标识我们正在寻找哪个多维数据集(headTransform.getHeadView(headView, 0);),另一个用于标识音频引擎。

因此,我的下一个假设(也是我看到的唯一可能性)是它由传递给eyeonDrawEye()处理。但是另一方面,在disassembly内部进行了简短浏览之后,我找不到headTransformeye之间的关系(这并不意味着没有关系,因为我没有花太多时间在那)。

所以我的问题是:

我的假设正确吗?渲染是否通过将camera与eyeView相乘来考虑头部运动?

最佳答案

好吧,我花了更多时间浏览反汇编,似乎我的假设是正确的。
RendererHelper中的私有类CardboardView实现以下方法(它非常大,因此我删除了对我来说并不重要的内容):

public void onDrawFrame(GL10 gl)
{
    // ...

    if (mVRMode)
    {
        Matrix.setIdentityM(mLeftEyeTranslate, 0);
        Matrix.setIdentityM(mRightEyeTranslate, 0);

        Matrix.translateM(mLeftEyeTranslate, 0, halfInterpupillaryDistance, 0.0F, 0.0F);

        Matrix.translateM(mRightEyeTranslate, 0, -halfInterpupillaryDistance, 0.0F, 0.0F);

        Matrix.multiplyMM(mLeftEye.getTransform().getEyeView(), 0, mLeftEyeTranslate, 0, mHeadTransform.getHeadView(), 0);

        Matrix.multiplyMM(mRightEye.getTransform().getEyeView(), 0, mRightEyeTranslate, 0, mHeadTransform.getHeadView(), 0);
    }

    // ...
}


最后两个矩阵乘法似乎是在headTransformeye之间建立关系的地方。

09-05 02:14