Как я могу использовать SensorManager.getOrientation для управления наклоном, как "мой бумажный самолет"?

игры для Android Мой Бумажный Самолет является отличным примером того, как реализовать элементы управления наклоном, но я изо всех сил пытаюсь понять, как я могу сделать что-то подобное.

У меня есть следующий пример, который использует getOrientation() из SensorManager. Все дело в сайт Pastebin здесь. Он просто печатает значения ориентации в текстовые поля. Вот самый релевантный фрагмент:

private void computeOrientation() {
    if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
                                        m_lastMagFields, m_lastAccels)) {
        SensorManager.getOrientation(m_rotationMatrix, m_orientation);

        /* 1 radian = 57.2957795 degrees */
        /* [0] : yaw, rotation around z axis
         * [1] : pitch, rotation around x axis
         * [2] : roll, rotation around y axis */
        float yaw = m_orientation[0] * 57.2957795f;
        float pitch = m_orientation[1] * 57.2957795f;
        float roll = m_orientation[2] * 57.2957795f;

        /* append returns an average of the last 10 values */
        m_lastYaw = m_filters[0].append(yaw);
        m_lastPitch = m_filters[1].append(pitch);
        m_lastRoll = m_filters[2].append(roll);
        TextView rt = (TextView) findViewById(R.id.roll);
        TextView pt = (TextView) findViewById(R.id.pitch);
        TextView yt = (TextView) findViewById(R.id.yaw);
        yt.setText("azi z: " + m_lastYaw);
        pt.setText("pitch x: " + m_lastPitch);
        rt.setText("roll y: " + m_lastRoll);
    }
}

проблема в том, что значения это выплевывает выглядит как нонсенс, или, по крайней мере, нет способа изолировать, какой тип движения пользователь выполнил. Я нарисовал диаграмму, чтобы указать 2 типа движения, которые я хотел бы обнаружить - 1. "наклон" для тангажа и 2. "поворот" для крена / рулевого управления:

Figure 1. Pitch and roll

(это изометрический вид телефона в ландшафтном режиме, конечно)

когда я наклоняю телефон вперед и назад вдоль его длинной оси - показано на 1. - Я ожидал, что только 1 из значений многое меняется, но все они, кажется, меняются кардинально. Аналогично, если я поворачиваю телефон вокруг воображаемой линии, которая выходит из экрана - показано в 2. - Я надеюсь, что меняется только значение рулона, но все значения сильно меняются.

проблема в том, когда я калибрую свою игру - что означает запись текущих значений углов x, y и z-позже я не знаю, как интерпретировать входящие обновленные углы, чтобы сказать: "Хорошо, похоже, вы наклонили телефон, и вы хотите свернуть 3 градусов влево". Это больше похоже на "хорошо, вы переместили телефон, и вы наклоняетесь и катитесь одновременно", даже если намерение было только рулоном. Смысл?

какие идеи? Я попытался использовать remapCoordinateSystem, чтобы узнать, влияет ли изменение оси. Никакая радость. Я думаю, что мне не хватает чего-то фундаментального с этим : - (

1 ответов


вы смешали ускорителя и отслежыватель megnetic сенсорных матриц. Код должен быть:

if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
                                    m_lastAccels, m_lastMagFields)) {

проверить getRotationMatrix(..)