使用陀螺仪和磁传感器旋转Rajawali相机

时间:2016-08-03 07:11:42

标签: android augmented-reality android-sensors rajawali

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

我想在相机视图上绘制一个表面,当我尝试最新版本的rajawali时,它不起作用。我花了很多天才发现最新版本不再支持绘制相机了。并且raja​​wali v0.9正常工作。因此,以下问题适用于v0.9。

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

getCamera().setOrientation(quaternion) 

没用。我不知道为什么。 现在我不知道下一步该做什么:(

1 个答案:

答案 0 :(得分: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);
}