Android - 根据传感器旋转矩阵移动视图

时间:2016-12-23 12:21:15

标签: android 3d augmented-reality

前言:我对图形非常陌生。

我试图更多地了解AR,并有一个宠物项目,应该允许我探索我的AR对象的位置。实际上我想在现实世界中粘贴一个平面图像并使用我的手机传感器来移动它,这样只有在我看到它时才能看到它。

我按照Android开发者页面上的示例进行操作,并且我有旋转矩阵和方向。两者似乎都有道理。我有我的形象,现在我只想在北方固定,但最终将它随机化为北方X度以及上下一些等。

我迷失了如何将图像放置在3D空间中以及如何使用旋转矢量来确定图像在屏幕上的位置。

非常感谢任何帮助或文章链接。

我正在使用Android开发者页面中的示例代码:

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        mGravity = event.values;
    } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        mGeomagnetic = event.values;
    }
    if (mGravity == null || mGeomagnetic == null) {
        return;
    }

    float R[] = new float[16];
    float I[] = new float[9];
    if (SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic)) {
        Log.d(TAG, ...);
    }
}

我的直觉是取Matrix.invertM的{​​{1}},然后使用R将反转的旋转矩阵乘以我要渲染的对象的世界位置(现在让我们假设物体在我以北5米处,放在(0,5,0,0)处。我使用指南针和水平仪来确保我的表面是平的,我的手机是N.上面的打印声明的结果是以下旋转矩阵:

Matrix.multiplyMV

这似乎是错误的,因为矩阵应该是单位矩阵:

-0.37,  0.93,  0.02,  0.00
-0.92, -0.37,  0.07,  0.00
 0.07,  0.01,  1.00,  0.00
 0.00,  0.00,  0.00,  1.00

1 个答案:

答案 0 :(得分:0)

而不是试图找出你错在哪里,我强烈建议你自己尝试进入它。网上有样本和回答的问题,可以准确显示你想要的内容,所以显然你可以尝试并从中学习(例如:Android sensors for OpenGL,github上也有一些)。

另外,既然你已经说过你对图形很陌生,我建议先对矩阵和变换以及对3D空间的理解做一些重读。

示例:http://www.songho.ca/opengl/gl_transform.html https://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0