Android - 根据传感器旋转矩阵移动视图
Android - Moving view according to sensor rotation matrix
前言:我对图形很陌生。
我正在尝试更多地了解 AR,并且有一个宠物项目应该允许我探索 AR 对象的位置。实际上,我想在现实世界中粘贴一个平面图像,并使用我的 phone 的传感器移动它,这样它只有在我看着它时才可见。
我遵循了 Android 开发者页面上的示例,并且我同时拥有旋转矩阵和方向。两者似乎都有道理。我有我的图像,现在我只想始终固定在北方,但最终会将其随机化为偏离北方 X 度以及一些 up/down 等
我不知道如何在 3D 中放置图像 space 以及如何使用旋转矢量确定图像在屏幕上的位置。
任何帮助或文章链接将不胜感激。
我正在使用来自 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, ...);
}
}
我的直觉是采用 R
的 Matrix.invertM
然后使用 Matrix.multiplyMV
将反转矩阵乘以我要渲染的对象的世界位置(现在让我们假设该物体在我以北 5 米处,将其置于 (0, 5, 0, 0))。我使用了一个圆规和一个水平仪来确保我的表面是平坦的并且我的 phone 是面向 N 的。上面打印语句的结果是以下旋转矩阵:
-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, 0
0, 1, 0, 0
0, 0, 1, 0
0, 0, 0, 1
我强烈建议您尝试自己解决问题,而不是试图找出您错在哪里。网络上有一些示例和已回答的问题可以准确显示您想要的内容,因此显然您可以尝试并从中学习(一个示例:Android sensors for OpenGL,github 上也有一些)。
另外,既然你说你对图形还很陌生,我建议先大量阅读矩阵和变换以及对 3D 的理解 space。
示例:http://www.songho.ca/opengl/gl_transform.html
https://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0
前言:我对图形很陌生。
我正在尝试更多地了解 AR,并且有一个宠物项目应该允许我探索 AR 对象的位置。实际上,我想在现实世界中粘贴一个平面图像,并使用我的 phone 的传感器移动它,这样它只有在我看着它时才可见。
我遵循了 Android 开发者页面上的示例,并且我同时拥有旋转矩阵和方向。两者似乎都有道理。我有我的图像,现在我只想始终固定在北方,但最终会将其随机化为偏离北方 X 度以及一些 up/down 等
我不知道如何在 3D 中放置图像 space 以及如何使用旋转矢量确定图像在屏幕上的位置。
任何帮助或文章链接将不胜感激。
我正在使用来自 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, ...);
}
}
我的直觉是采用 R
的 Matrix.invertM
然后使用 Matrix.multiplyMV
将反转矩阵乘以我要渲染的对象的世界位置(现在让我们假设该物体在我以北 5 米处,将其置于 (0, 5, 0, 0))。我使用了一个圆规和一个水平仪来确保我的表面是平坦的并且我的 phone 是面向 N 的。上面打印语句的结果是以下旋转矩阵:
-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, 0
0, 1, 0, 0
0, 0, 1, 0
0, 0, 0, 1
我强烈建议您尝试自己解决问题,而不是试图找出您错在哪里。网络上有一些示例和已回答的问题可以准确显示您想要的内容,因此显然您可以尝试并从中学习(一个示例:Android sensors for OpenGL,github 上也有一些)。
另外,既然你说你对图形还很陌生,我建议先大量阅读矩阵和变换以及对 3D 的理解 space。
示例:http://www.songho.ca/opengl/gl_transform.html https://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0