我正在构建一个非常标准的 AR 应用程序,它会在相机上覆盖一些东西,并且在使用 SensorManager 时遇到了问题。我基本上是在尝试从传感器管理器中获取旋转矩阵,然后调用 glMultMatrix 来相应地旋转所有内容。在 SensorManager.getRotationMatrix 的文档中看起来这是可能的。然而,当我与旋转矩阵相乘时,一切都会变得扭曲并四处移动,不像你看到其他 ar 应用程序所期望的那样。我在下面得到了一些代码:
private float[] gravity = new float[3];
private float[] geomagnetic = new float[3];
private float filteringFactor = 0.01f;
private float[] rotationMatrixOut = new float[16];
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geomagnetic[0] = event.values[0] * filteringFactor + geomagnetic[0] * (1.0f - filteringFactor);
geomagnetic[1] = event.values[1] * filteringFactor + geomagnetic[1] * (1.0f - filteringFactor);
geomagnetic[2] = event.values[2] * filteringFactor + geomagnetic[2] * (1.0f - filteringFactor);
} else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
gravity[0] = event.values[0] * filteringFactor + gravity[0] * (1.0f - filteringFactor);
gravity[1] = event.values[1] * filteringFactor + gravity[1] * (1.0f - filteringFactor);
gravity[2] = event.values[2] * filteringFactor + gravity[2] * (1.0f - filteringFactor);
}
SensorManager.getRotationMatrix(rotationMatrixOut, null, gravity, geomagnetic);
}
我也尝试过使用 SensorManager.remapCoordinateSystem 但没有运气。我的绘图代码如下,这是非常标准的东西,我注释掉了lookat,因为我不确定这是否会造成麻烦
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//GLU.gluLookAt(gl, mCamera.position.x, mCamera.position.y, mCamera.position.z,
// mCamera.target.x, mCamera.target.y, mCamera.target.z,
// mCamera.up.x, mCamera.up.y, mCamera.up.z);
gl.glMultMatrixf(rotationMatrixOut, 0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glLineWidth(1.0f);
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
gl.glDrawArrays(GL10.GL_LINES, 0, 2 * 201 * 2);
如果有人能提供帮助,我会为此失去太多睡眠,不胜感激。谢谢