Оказывается, что данные датчика из Sensor.TYPE_GAME_ROTATION_VECTOR имеют очень разные значения (углы) каждый раз, когда моя активность регистрирует слушателя. Требуется только небольшой уклон телефона, чтобы получить действительно разные значения. Различные устройства также реагируют по-разному, но все они имеют показания со смещением.
Это приводит к тому, что начальный угол обзора (обычно) составляет 90 градусов влево или вправо от центра видео.
Благодаря этой записи мне удалось вычислить начальное смещение курса и повернуть матрицу положения телефона для компенсации.
Добавить переменную-член private float initialHeading
с начальным значением 0.
Затем в PhoneSrientationListener onSensorChanged добавьте следующий код после поворота матрицы Android в OpenGL:
if (initialHeading == 0) {
initialHeading = (float) ((angles[0] + 2 * Math.PI) % (2 * Math.PI));
}
float angle = (float) ((Math.PI - initialHeading) * 180 / Math.PI);
Matrix.rotateM(phoneInWorldSpaceMatrix, 0, angle, 0, 1, 0);