2014-02-07 3 views
2

Я тестирую код акселерометра в Unity3D 4.3. То, что я хочу сделать, - это просто изменить угол объекта, наклоняя ipad, чтобы подделать угол обзора, как настоящий live. Все работает отлично, за исключением того факта, что акселерометр слишком чувствителен, и я вижу, что GameObject похож на мерцание, даже если я положил его на стол. Как я могу сделать его менее чувствительным, так что даже когда вы держите рукой, угол изменится в зависимости от наклона, и объект останется устойчивым?unity3d - Чувствительность акселерометра

Вот мой код:

void Update() { 
     Vector3 dir = Vector3.zero; 

     dir.x = Mathf.Round(Input.acceleration.x * 1000.0f)/1000.0f; 
     dir.y = Mathf.Round(Input.acceleration.y * 1000.0f)/1000.0f; 
     dir.z = Mathf.Round(Input.acceleration.z * 1000.0f)/1000.0f; 

     // clamp acceleration vector to the unit sphere 
     if (dir.sqrMagnitude > 1) 
      dir.Normalize(); 

     // Make it move 10 meters per second instead of 10 meters per frame... 
     dir *= Time.deltaTime; 
     dir *= speed; 

     acx = dir.x; 
     acy = dir.y; 
     acz = dir.z; 
     transform.rotation = Quaternion.Euler(dir.y-20, -dir.x, 0); 
    } 

ответ

4

Вам может понадобиться использовать low pass filter (S Exponential Moving Average для лучшего описания в отношении программного обеспечения.) Перед использованием выходного сигнала. Я всегда использую собственный код для получения значений акселерометра и гироскопа на iPhone, поэтому я не уверен на 100%, как Unity справляется с этим. Но из того, что вы описываете, значения выглядят нефильтрованными.

Фильтр нижних частот рассчитывает средневзвешенное значение из всех ваших предыдущих значений. Имея, например коэффициент фильтра на 0,1 Вашего Взвешенного среднего:

Vector3 aNew = Input.acceleration; 
a = 0.1 * aNew + 0.9 + a; 

Таким образом, ваши значения сглаживаются за счет небольшой задержки. Запуск акселерометра с частотой 50 Гц вы не заметите.

+2

Я нашел [это] (http://forum.unity3d.com/threads/224147-Are-the-docs-wrong-on-accelometer-low-pass-filter), подумал, что если у кого-то такая же проблема может сэкономить несколько часов. – sooon

0

Я не мог сделать пример работы Кея, как это не умножая последнюю часть, так вот моя небольшая коррекция:

Vector3 aNew = Input.acceleration; 
a = (0.1 * aNew) + (0.9 * a); 
Смежные вопросы