0

我正在使用 Rajawali lib 开发增强现实应用程序。我的问题如下。

我想在相机视图上绘制一个表面,当我尝试最新版本的 rajawali 时,它没有用。我花了很多天发现最新的不再支持通过相机绘制。rajawali v0.9 工作正常。所以以下问题适用于 v0.9。

当我尝试注册 SensorEventListener 时,在 onSensorChanged() 中我得到了 3 个值,它们代表了 android 设备的 3 维,但它非常嘈杂且不稳定。我试过实现低通滤波器,但它仍然是噪音。最后我找到了这个问题,但是在 v0.9 上,

getCamera().setOrientation(quaternion) 

不工作。我不知道为什么。现在我不知道下一步该怎么做:(

4

1 回答 1

0

这是我的代码,它在我的项目中运行良好,希望对您有所帮助。

// 我的渲染器类的代码片段

@Override
public void onRender(final long elapsedTime, final double deltaTime) {
    mHeadTracker.getLastHeadView(mHeadTransform.getHeadView(), 0);

    android.opengl.Matrix.invertM(mHeadTransform.getHeadView(), 0, mHeadTransform.getHeadView(), 0);

    Quaternion q = mHeadTransform.getQuaternion(mHeadTransform.getHeadView(), 0);

    getCurrentCamera().setOrientation(q);

    super.onRender(elapsedTime, deltaTime);
}

// HeadTransform 类的代码片段

private static Quaternion sQuaternion = new Quaternion();
public Quaternion getQuaternion(float[] quaternion, int offset) {
    if (offset + 4 > quaternion.length) {
        throw new IllegalArgumentException(
                "Not enough space to write the result");
    }
    float[] m = this.mHeadView;
    float t = m[0] + m[5] + m[10];
    float x;
    float y;
    float z;
    float w;
    float s;
    if (t >= 0.0F) {
        s = (float) Math.sqrt(t + 1.0F);
        w = 0.5F * s;
        s = 0.5F / s;
        x = (m[9] - m[6]) * s;
        y = (m[2] - m[8]) * s;
        z = (m[4] - m[1]) * s;
    } else {
        if ((m[0] > m[5]) && (m[0] > m[10])) {
            s = (float) Math.sqrt(1.0F + m[0] - m[5] - m[10]);
            x = s * 0.5F;
            s = 0.5F / s;
            y = (m[4] + m[1]) * s;
            z = (m[2] + m[8]) * s;
            w = (m[9] - m[6]) * s;
        } else {
            if (m[5] > m[10]) {
                s = (float) Math.sqrt(1.0F + m[5] - m[0] - m[10]);
                y = s * 0.5F;
                s = 0.5F / s;
                x = (m[4] + m[1]) * s;
                z = (m[9] + m[6]) * s;
                w = (m[2] - m[8]) * s;
            } else {
                s = (float) Math.sqrt(1.0F + m[10] - m[0] - m[5]);
                z = s * 0.5F;
                s = 0.5F / s;
                x = (m[2] + m[8]) * s;
                y = (m[9] + m[6]) * s;
                w = (m[4] - m[1]) * s;
            }
        }
    }
    quaternion[(offset + 0)] = x;
    quaternion[(offset + 1)] = y;
    quaternion[(offset + 2)] = z;
    quaternion[(offset + 3)] = w;

    Log.d("facevr", x + "," + y + "," + z + "," + w);

    return sQuaternion.setAll(w, x, y, z);
}
于 2017-05-17T12:34:38.923 回答