2017-03-20 11 views
5

W mojej aplikacji muszę znać rotację urządzenia. Staram się wyciągnąć wartość oś y z żyroskopu przy użyciu następujących:Jedność: Input.gyro.attitude Dokładność

var y = Input.gyro.attitude.eulerAngles.y;

Gdybym po prostu wyjściowy do ekranu i skręcić w kręgu (trzymając mój telefon prosto w górę iw dół ... tak jakbyś patrzył na ekran), otrzymuję:

270, 270, 270, 270, itd ... 270, 290, 310, 20, 40, 60, 80 (bardzo szybko) ... 90, 90, 90, 90 itd. ... bla ...

Czy jest jakiś sposób, aby uwzględnić ten skok liczb?

+0

Tak Unikaj używania Euler. Unity używa kwaternionu, podczas gdy Euler jest po to, aby uzyskać bardziej przyjazną i czytelną reprezentację. Nie wiem, co chcesz zrobić z wartościami, więc ... ale po prostu zapomnij o euler i używaj kwaternionu z dostarczonymi metodami (lerp, slerp, lookrotation ...) – Everts

Odpowiedz

2

Można ustawić maksymalny obrót, aby zapobiec szybkim skokom.

y_diff = new_y - last_y; 
y = y + Mathf.Clamp(y_diff, -limit, limit); 
1

Do uzyskania tego efektu można użyć interpolacji liniowej. Jedyne, co musisz wziąć pod uwagę, to jak szybko to zrobisz, ponieważ telefon będzie stale się obracał i nie chcesz, aby twoje wartości były opóźnione.
Przykładem korzystania Mathf.Lerp:

// Your values 
    var y = 0;  

    // speed for the Lerp 
    static float t = 1.0f; 

    void Update() 
    { 
     float old = y 
     float new = Input.gyro.attitude.eulerAngles.y; 
     // Interpolate 
     y = Mathf.Lerp(old, new, t * Time.deltaTime);  
    } 

odwołuje się od here

4

Gimbal Blokada

Co widzisz coś, co nazywa się kardanowe blokada więcej informacji here. Zdarza się, że kąty Eulera przecinają płaszczyznę 360 lub bardziej szczegółowo (dwie z trzech osi są popychane do konfiguracji równoległej), i dlatego ludzie używają kwaternionów.

Quaternions

Nie należy bezpośrednio ciągnąc kątów Eulera. Polecam coś takiego:

Quaternion q = Input.gyro.attitude.rotation; 

Używając quaternion zamiast kątów Eulera unikniemy kardanowego zamka, a zatem uniknąć 360, 0 problemu.

Jeśli po prostu chcesz pokazać kąta są skierowane w kierunku y mogę polecić coś takiego, to zawija kąt Y 0 do 180 stopni:

/// <summary> 
/// This method normalizes the y euler angle between 0 and 180. When the y euler 
/// angle crosses the 180 degree threshold if then starts to count back down to zero 
/// </summary> 
/// <param name="q">Some Quaternion</param> 
/// <returns>normalized Y euler angle</returns> 
private float normalizedYAngle(Quaternion q) 
{ 
    Vector3 eulers = q.eulerAngles; 
    float yAngle = eulers.y; 
    if(yAngle >= 180f) 
    { 
     //ex: 182 = 182 - 360 = -178 
     yAngle -= 360; 
    } 
    return Mathf.Abs(yAngle); 
}