【问题标题】:Rotate Rajawali camera using gyroscope and magnetic sensor使用陀螺仪和磁传感器旋转 Rajawali 相机
【发布时间】:2016-08-03 07:11:42
【问题描述】:

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

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

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

getCamera().setOrientation(quaternion) 

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

【问题讨论】:

  • 你终于找到解决办法了吗?
  • 不,但我不再使用它了:D 你有这个问题吗?

标签: android augmented-reality android-sensors rajawali


【解决方案1】:

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

//我的渲染器类的代码sn-p

@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类的代码sn-p

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多