2016-12-27 5 views
1

Я использую новейший SDK Google (1.10), но я проверил некоторые примеры из единства, такие как защита замка, и я заметил, что представление начало дрейфовать, когда я положил телефон на стол. есть ли способ предотвратить этот дрейф программно?Unity google cardboard drift

Я видел несколько видео, чтобы исправить гироскоп на самсунг, но я хочу некоторый код, чтобы предотвратить это

ответ

1

Это все еще не решена проблема, как описано в этом посте:

GvrViewerMain rotates the camera yourself. Unity3D + Google VR

Но согласно к вашим потребностям, вы можете найти полезное следующее обходное решение.

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

using UnityEngine; 

public class GyroCorrector { 

    public enum Correction 
    { 
     NONE, 
     BEST 
    } 

    private Correction m_correction; 

    public GyroCorrector(Correction a_correction) 
    { 
     m_correction = a_correction; 
    } 

    private void CorrectValueByThreshold(ref Vector3 a_vDeltaRotation, float a_fXThreshold = 1e-1f, float a_fYThreshold = 1e-2f, float a_fZThreshold = 0.0f) 
    { 

     // Debug.Log(a_quatDelta.x + " " + a_quatDelta.y + " " + a_quatDelta.z); 

     a_vDeltaRotation.x = Mathf.Abs(a_vDeltaRotation.x) < a_fXThreshold ? 0.0f : a_vDeltaRotation.x + a_fXThreshold; 
     a_vDeltaRotation.y = Mathf.Abs(a_vDeltaRotation.y) < a_fYThreshold ? 0.0f : a_vDeltaRotation.y + a_fYThreshold; 
     a_vDeltaRotation.z = Mathf.Abs(a_vDeltaRotation.z) < a_fZThreshold ? 0.0f : 0.0f;//We just ignore the z rotation 
    } 

    public Vector3 Reset() 
    { 
     return m_v3Init; 
    } 

    public Vector3 Get(Vector3 a_v3Init) 
    { 
     if (!m_bInit) 
     { 
      m_bInit = true; 
      m_v3Init = a_v3Init; 
     } 

     Vector3 v = Input.gyro.rotationRateUnbiased; 
     if (m_correction == Correction.NONE) 
      return a_v3Init + v; 


     CorrectValueByThreshold(ref v); 

     return a_v3Init - v; 
    } 

} 

... А потом использовать что-то вроде этого в методе "UpdateHead" от "GvrHead":

GvrViewer.Instance.UpdateState(); 

if (trackRotation) 
{ 
    var rot = Input.gyro.attitude;//GvrViewer.Instance.HeadPose.Orientation; 

    if(Input.GetMouseButtonDown(0)) 
    { 
     transform.eulerAngles = m_gyroCorrector.Reset(); 
    } 
    else 
    { 
     transform.eulerAngles = m_gyroCorrector.Get(transform.eulerAngles);//where m_gyroCorrector is an instance of the previous class 
    } 

} 

Вы можете найти некоторые проблемы. В основном, но не исключительно:

  • Там будет латентность проблемы при движении головы, как есть смещение для обнаружения движения

  • Вы имеете дело с относительными позициями, которые приходят с неточностями. Таким образом, вы не на 100% уверены, что находите ту же позицию при выполнении противоположного движения.

  • Вы используете представление эйлера вместо кватерниона, и оно кажется менее точным.

Вы также можете быть заинтересованы в этих ссылках, говоря о поле:

http://scholarworks.uvm.edu/cgi/viewcontent.cgi?article=1449&context=graddis

Gyroscope drift on mobile phones

и этом куске коды: https://github.com/asus4/UnityIMU

Надеется, что это может помочь ,

Смежные вопросы