Использование информации об ориентации, чтобы получить направление вниз

Я работаю над приложением, которое включает в себя рисование линии на моем экране Android в зависимости от его ориентации и может использовать некоторую помощь или указатели.

Линия рисуется следующим образом: если телефон удерживается на ровном месте, то линия сжимается и становится точкой, а когда телефон наклоняется и ориентируется, линия становится больше - то есть телефон встал, а линия направлена ​​вниз, и это максимум величина 9,8 и держится ровно, это маленькая точка. Важно, независимо от того, под каким углом телефон находится под стрелкой, которая всегда указывает вниз, то есть на линию гравитации.

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

Спасибо

1 ответ

Решение

Итак, я понял это с большой помощью из источника на острове Реплика и, в свою очередь, из газеты Nvidia.

Как только у вас будет шаг, крен, рыскание от показаний датчика TYPE_ORIENTATION:

        @Override   
public void onSensorChanged(SensorEvent event) 
{
    synchronized (this) 
    {
        m_orientationInput[0] = x;
        m_orientationInput[1] = y;
        m_orientationInput[2] = z;

       canonicalOrientationToScreenOrientation(m_rotationIndex, m_orientationInput, m_orientationOutput);

       // Now we have screen space rotations around xyz.
       final float horizontalMotion = m_orientationOutput[0] / 90.0f;
       final float verticalMotion = m_orientationOutput[1] / 90.0f;

       // send details to renderer....

   }
}

Вот функция canonicalOrientationToScreenOrientation:

    // From NVIDIA http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf
private void canonicalOrientationToScreenOrientation(int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = 
    { 
        { 1, -1, 0, 1 },   // ROTATION_0 
        {-1, -1, 1, 0 },   // ROTATION_90 
        {-1,  1, 0, 1 },   // ROTATION_180 
        { 1,  1, 1, 0 }    // ROTATION_270 
    };

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0] = (float)as[0] * canVec[ as[2] ]; 
    screenVec[1] = (float)as[1] * canVec[ as[3] ]; 
    screenVec[2] = canVec[2]; 
}
Другие вопросы по тегам