【问题标题】:How to anchor an object using Cardboard Java SDK如何使用 Cardboard Java SDK 锚定对象
【发布时间】:2018-08-28 06:33:18
【问题描述】:

我目前正在使用 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)。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多