6

के आधार पर कम्पास दिशा अलग है, मेरे उन्नत वास्तविकता ऐप को कैमरे के दृश्य के कंपास असर की आवश्यकता है, और सेंसरमैनगर से दिशा प्राप्त करने के कई उदाहरण हैं।फोन अभिविन्यास

हालांकि मुझे फोन ओरिएंटेशन के आधार पर परिणामस्वरूप मूल्य अलग-अलग मिल रहा है - बाईं ओर घूमने वाला परिदृश्य बाईं ओर घूर्णन के लिए लगभग 10 डिग्री अलग है (ROTATION_0 और ROTATION_180 के बीच अंतर कम है, लेकिन फिर भी अलग है)। यह अंतर किसी भी एआर प्रभाव को बर्बाद करने के लिए पर्याप्त है।

क्या यह अंशांकन के साथ कुछ करना है? (मुझे विश्वास नहीं है कि मैं 8 चीज़ों की आकृति ठीक से कर रहा हूं - मैंने यूट्यूब पर कई तरीकों से कोशिश की है)।

कोई विचार क्यों एक अंतर है? क्या मैंने रोटेशन मैट्रिक्स सामान पर गड़बड़ की है? मैं एक ही उन्मुखीकरण के लिए एप्लिकेशन को प्रतिबंधित करने का विकल्प है, लेकिन यह अभी भी मुझे चिंतित है कि कम्पास पढ़ने अभी भी बहुत सही नहीं है (भले ही छानने के बाद यह काफी स्थिर है)

public void onSensorChanged(SensorEvent event) { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { 
      return; 
     } 

     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; 
     if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; 

     if (mGravity != null && mGeomagnetic != null) { 

      float[] rotationMatrixA = mRotationMatrixA; 
      if (SensorManager.getRotationMatrix(rotationMatrixA, null, mGravity, mGeomagnetic)) { 

       float[] rotationMatrixB = mRotationMatrixB; 

       Display display = getWindowManager().getDefaultDisplay(); 
       int deviceRot = display.getRotation(); 

       switch (deviceRot) 
       { 
       // portrait - normal 
       case Surface.ROTATION_0: SensorManager.remapCoordinateSystem(rotationMatrixA, 
         SensorManager.AXIS_X, SensorManager.AXIS_Z, 
         rotationMatrixB); 
       break; 
       // rotated left (landscape - keys to bottom) 
       case Surface.ROTATION_90: SensorManager.remapCoordinateSystem(rotationMatrixA, 
         SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X, 
         rotationMatrixB); 
       break; 
       // upside down 
       case Surface.ROTATION_180: SensorManager.remapCoordinateSystem(rotationMatrixA, 
         SensorManager.AXIS_X, SensorManager.AXIS_Z, 
         rotationMatrixB); 
       break; 
       // rotated right 
       case Surface.ROTATION_270: SensorManager.remapCoordinateSystem(rotationMatrixA, 
         SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X, 
         rotationMatrixB); 
       break; 

       default: break; 
       } 

       float[] dv = new float[3]; 
       SensorManager.getOrientation(rotationMatrixB, dv); 
       // add to smoothing filter 
       fd.AddLatest((double)dv[0]); 
      } 
      mDraw.invalidate();  
     } 
    } 

उत्तर

10

इस

प्रयास करें
public void onSensorChanged(SensorEvent event) { 
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) { 
     return; 
    } 

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values.clone(); 
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values.clone(); 

    if (mGravity != null && mGeomagnetic != null) { 

     float[] rotationMatrixA = mRotationMatrixA; 
     if (SensorManager.getRotationMatrix(rotationMatrixA, null, mGravity, mGeomagnetic)) { 

      float[] rotationMatrixB = mRotationMatrixB; 
      SensorManager.remapCoordinateSystem(rotationMatrixA, 
        SensorManager.AXIS_X, SensorManager.AXIS_Z, 
        rotationMatrixB); 
      float[] dv = new float[3]; 
      SensorManager.getOrientation(rotationMatrixB, dv); 
      // add to smoothing filter 
      fd.AddLatest((double)dv[0]); 
     } 
     mDraw.invalidate();  
    } 
} 

आपको स्विच स्टेटमेंट की आवश्यकता नहीं है, वहाँ getRotationMatrix, remapCoordinateSystem और stackoverflow प्रश्नों से getOrientation से संबंधित बहुत भ्रम प्रतीत होता है।
मैं शायद निकट भविष्य में इनका विस्तार विवरण लिखूंगा।

+0

मैन! मैं 2 घंटे से अधिक समय तक SO खोज रहा हूं, और बहुत सारे गलत जवाब हैं। आपका पहला ऐसा व्यक्ति है जो वास्तव में मेरे लिए सही तरीके से काम करता है। इसके लिए धन्यवाद। – BoD

+0

मैंने पोस्ट की प्रतिलिपि बनाई और संपादित की। मुझे एहसास नहीं हुआ कि मुश के पास mgravity = event.values ​​था, यह event.values.clone() होना चाहिए। एमजीओमैग्नेटिक –

+0

'सेंसर मैनेजर.remapCoordinateSystem' के लिए एक ही समाधान है। धन्यवाद। –

1

होन का जवाब वास्तव में गलत है क्योंकि यह प्रदर्शन रोटेशन के लिए जिम्मेदार नहीं है। This सही उत्तर है।

संबंधित मुद्दे