通过谷歌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);
),另一个用于标识音频引擎。因此,我的下一个假设(也是我看到的唯一可能性)是它由传递给
eye
的onDrawEye()
处理。但是另一方面,在disassembly内部进行了简短浏览之后,我找不到headTransform
和eye
之间的关系(这并不意味着没有关系,因为我没有花太多时间在那)。所以我的问题是:
我的假设正确吗?渲染是否通过将
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);
}
// ...
}
最后两个矩阵乘法似乎是在
headTransform
和eye
之间建立关系的地方。