Ứ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();
}
}
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
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 –
'SensorManager.remapCoordinateSystem' là giải pháp. Cảm ơn. –