Использование информации об ориентации, чтобы получить направление вниз - PullRequest
1 голос
/ 27 февраля 2011

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

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

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

Спасибо

1 Ответ

2 голосов
/ 27 февраля 2011

Хорошо, так что я понял это с большой помощью из источника на Острове Реплики и, в свою очередь, из бумаги 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....

   }
}

Вот каноническая функция OrientationToScreenOrientation:

    // 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]; 
}
...