我正在构建一个AR应用程序,其中相机预览中的对象被计算机视觉算法(solvePnP)跟踪。我想让这种体验更顺畅,并使用手机的陀螺仪在solvePnP结果之间旋转对象。执行此操作的第一步是运行solvePnP一次,在屏幕上投射点,然后依靠方向仅来跟踪对象(我确保不要过多地翻译手机)。
理想的效果是,如果我将手机保持在纵向模式,直立,相机指向某个感兴趣的物体。如果我围绕其垂直轴正向旋转手机,我希望屏幕上的相应对象围绕其垂直轴旋转。我使用Sensor.TYPE_ROTATION_VECTOR从手机中获取四元数。
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
if (!didInitRotation) {
SensorManager.getRotationMatrixFromVector(mInitialRotationMatrix, event.values);
didInitRotation = true;
}
SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
float[] rotationMatrixInverse = new float[16];
float[] relativeOrientation = new float[16];
Matrix.invertM(rotationMatrixInverse, 0, mRotationMatrix, 0);
Matrix.multiplyMM(relativeOrientation, 0, rotationMatrixInverse, 0, mInitialRotationMatrix, 0);
mGLAssetSurfaceView.getRenderer().setRotationMatrix(relativeOrientation);
}
}
正如你所看到的,我提到了一些"初始旋转矩阵"然后将其乘以当前旋转矩阵的倒数以得到相对定向。然后我将它应用于OpenGL中的视图矩阵。
结果是TYPE_ROTATION_VECTOR
表现得很奇怪。如果我绕着x轴旋转手机,我会看到屏幕上的物体从屏幕的一个角落对角线移动到另一个角落。