के आधार पर कम्पास दिशा अलग है, मेरे उन्नत वास्तविकता ऐप को कैमरे के दृश्य के कंपास असर की आवश्यकता है, और सेंसरमैनगर से दिशा प्राप्त करने के कई उदाहरण हैं।फोन अभिविन्यास
हालांकि मुझे फोन ओरिएंटेशन के आधार पर परिणामस्वरूप मूल्य अलग-अलग मिल रहा है - बाईं ओर घूमने वाला परिदृश्य बाईं ओर घूर्णन के लिए लगभग 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();
}
}
मैन! मैं 2 घंटे से अधिक समय तक SO खोज रहा हूं, और बहुत सारे गलत जवाब हैं। आपका पहला ऐसा व्यक्ति है जो वास्तव में मेरे लिए सही तरीके से काम करता है। इसके लिए धन्यवाद। – BoD
मैंने पोस्ट की प्रतिलिपि बनाई और संपादित की। मुझे एहसास नहीं हुआ कि मुश के पास mgravity = event.values था, यह event.values.clone() होना चाहिए। एमजीओमैग्नेटिक –
'सेंसर मैनेजर.remapCoordinateSystem' के लिए एक ही समाधान है। धन्यवाद। –