Использование информации об ориентации, чтобы получить направление вниз
Я работаю над приложением, которое включает в себя рисование линии на моем экране 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];
}