首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用陀螺仪和磁传感器旋转Rajawali相机

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

Stack Overflow用户
提问于 2016-08-03 15:11:42
回答 1查看 233关注 0票数 0

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

我想在相机视图上绘制一个表面,当我尝试rajawali的最新版本时,它不起作用。我花了很多天,发现最新版本不再支持draw over camera。rajawali v0.9运行良好。因此,以下问题适用于v0.9。

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

代码语言:javascript
复制
getCamera().setOrientation(quaternion) 

没有起作用。我不知道为什么。现在我不知道下一步该做什么了:

EN

回答 1

Stack Overflow用户

发布于 2017-05-17 20:34:39

这是我的代码,它在我的项目中工作得很好,我希望它能对你有所帮助。

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

代码语言:javascript
复制
@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类的代码片段

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38736755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档