猿问

如何使用 Cardboard Java SDK 锚定对象

我目前正在使用 Cardboard SDK 开展一个项目,我现在比较震惊。


我想在视线的中心显示一个十字,就像在 FPS 中一样,并在用户移动头部时将其保持在视线的中心。


我知道在这段代码中:


public void onNewFrame(HeadTransform headTransform) {

    float[] headView = new float[16];

    headTransform.getHeadView(headView, 0);

}

headView 参数将包含头部的变换矩阵(旋转 + 平移)(感谢这个 SO:Android VR 工具包 - HeadTransform getHeadView 矩阵表示)。


我试图这样做:


private float[] mHeadView = new float[16];


public void onNewFrame(HeadTransform headTransform) {

    headTransform.getHeadView(mHeadView, 0);

}


public void onDrawEye(Eye eye) {

    float[] mvpMatrix = new float[16];

    float[] modelMatrix = new float[16];

    float[] mvMatrix = new float[16];

    float[] camera = new float[16];

    Matrix.setLookAt(camera, 0, 0, 0, -2, 0, 0, -1, 0, 1, 0);

    Matrix.multiplyMM(modelMatrix, 0, mHeadView, 0, camera, 0);

    Matrix.multiplyMM(mvMatrix, 0, eye.getEyeView(), 0, modelMatrix, 0);

    Matrix.multiplyMM(mvpMatrix, 0, eye.getEyePerspective(0.1, 100), 0, mvMatrix, 0);


    // Pass the mvpMatrix and vertices buffer to the vertex shader.

}

这是我的顶点着色器:


uniform mat4 uMatrix;

attribute vec4 vPosition;

attribute vec4 vColors;

varying vec4 color;

void main() {

    color = vColors;

    gl_Position = uMatrix * vPosition;

}

但是十字架仍然锚定在它的初始位置并且不跟随头部。


我错过了什么吗?我怎样才能让我的十字架跟随我的头并保持在视线的中心?


预先感谢您的回答:)


(PS:我不想使用Unity,因为这个项目只能使用Java SDK)。


杨__羊羊
浏览 169回答 1
1回答

慕后森

tl;dr:对于头部锁定的十字准线,跳过mHeadView矩阵的乘法。如果你想要一个头部锁定对象,你需要在头部空间而不是世界空间中定义它。您当前的代码定义了世界空间中的十字准线。该mHeadView转换从世界空间映射到当前的头部空间,占当期头转动。你不需要乘以这个,它只需要世界锁定的对象。
随时随地看视频慕课网APP

相关分类

Java
我要回答