如何使用Cardboard Java SDK锚定对象

时间:2018-08-22 08:42:55

标签: java android opengl-es google-cardboard google-vr

我目前正在使用Cardboard SDK进行项目,而现在我的印象比较深刻。

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

我知道这段代码:

public void onNewFrame(HeadTransform headTransform) {
    float[] headView = new float[16];
    headTransform.getHeadView(headView, 0);
}

headView参数将包含头部的转换矩阵(旋转+平移)(由于此SO:Android VR Toolkit - HeadTransform getHeadView matrix representation)。

我试图这样做:

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)。

1 个答案:

答案 0 :(得分:0)

tl; dr:对于头锁十字准线,请跳过与mHeadView矩阵的相乘。

如果要使用头部锁定的对象,则需要在头部空间而不是世界空间中定义它。您当前的代码在世界空间中定义了十字准线。 mHeadView变换从世界空间映射到当前的头部空间,并考虑了当前头部的旋转。您不需要乘以它,只有世界锁定对象才需要。