Подтвердить что ты не робот

Как я могу использовать SensorManager.getOrientation для управления наклоном, например "My Paper Plane"?

Android-игра My Paper Plane - отличный пример того, как реализовать управление наклоном, но я изо всех сил пытался понять, как я могу сделать что-то подобное.

У меня есть следующий пример, который использует 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);
    }
}

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

Figure 1. Pitch and roll

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

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

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

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

4b9b3361

Ответ 1

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

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

Отъезд getRotationMatrix(..)