6

Ứng dụng thực tế tăng cường của tôi cần mang la bàn của chế độ xem máy ảnh và có rất nhiều ví dụ về việc nhận hướng từ sensormanager.Hướng la bàn khác nhau tùy theo hướng điện thoại

Tuy nhiên, tôi thấy giá trị kết quả khác nhau tùy thuộc vào hướng điện thoại - cảnh quay được xoay sang phải là khoảng 10 độ khác với cảnh xoay sang trái (chênh lệch giữa ROTATION_0 và ROTATION_180 ít hơn, nhưng vẫn khác nhau). Sự khác biệt này là đủ để hủy hoại bất kỳ hiệu ứng AR nào.

Có liên quan gì đến hiệu chuẩn không? (Tôi không tin rằng tôi đang làm con số 8 điều đúng - Tôi đã thử nhiều cách khác nhau mà tôi đã tìm thấy trên youtube).

Mọi ý tưởng tại sao có sự khác biệt? Tôi đã rối tung lên những thứ ma trận xoay? Tôi có tùy chọn hạn chế các ứng dụng để định hướng duy nhất, nhưng nó vẫn quan tâm tôi rằng đọc la bàn vẫn không phải là rất chính xác (mặc dù sau khi lọc nó khá ổn định)

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();  
     } 
    } 

Trả lời

10

Hãy thử điều này

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();  
    } 
} 

Bạn không cần báo cáo chuyển đổi, có vẻ như có rất nhiều sự nhầm lẫn liên quan đến getRotationMatrix, remapCoordinateSystem và getOrientation từ các câu hỏi ngăn xếp.
Tôi có thể sẽ viết một lời giải thích chi tiết về những điều này trong tương lai gần.

+0

Man! Tôi đã tìm kiếm SO trong hơn 2 giờ, và có rất nhiều câu trả lời WRONG. Của bạn là người đầu tiên thực sự hoạt động chính xác cho tôi. Cám ơn vì cái này. – BoD

+0

Tôi đã sao chép và chỉnh sửa bài đăng. Tôi không nhận ra rằng Mush có mGravity = event.values, nó phải là event.values.clone(). Tương tự đối với mGeomagnetic –

+0

'SensorManager.remapCoordinateSystem' là giải pháp. Cảm ơn. –

1

Câu trả lời của Hoàn thực sự không chính xác vì nó không tính đến xoay màn hình. This là câu trả lời đúng.

Các vấn đề liên quan