浏览谷歌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
的{{1}}处理。但另一方面,在disassembly内部进行了简短的审视之后,我找不到onDrawEye()
和headTransform
之间的关系(这并不意味着没有关系,因为我没有' t投入了很多时间。)
所以我的问题:
我的假设是对的吗?渲染是通过将eye
乘以eyeView来计算头部运动吗?
答案 0 :(得分:1)
好吧,我花了一些时间浏览反汇编,似乎我的假设是正确的。
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
之间的关系。