Orientasi sensor
Data sensor dari kelas Accelerometer, Gyrometer, Compass, Inclinometer, dan OrientationSensor ditentukan oleh sumbu referensinya. Sumbu ini didefinisikan oleh bingkai referensi perangkat dan diputar dengan perangkat saat pengguna mengubahnya. Jika aplikasi Anda mendukung rotasi otomatis dan reorientasi itu sendiri untuk mengakomodasi perangkat saat pengguna memutarnya, Anda harus menyesuaikan data sensor Anda untuk rotasi sebelum menggunakannya.
API penting
Orientasi tampilan vs orientasi perangkat
Untuk memahami sumbu referensi untuk sensor, Anda perlu membedakan orientasi tampilan dari orientasi perangkat. Orientasi tampilan adalah teks arah dan gambar ditampilkan di layar sedangkan orientasi perangkat adalah posisi fisik perangkat.
Catatan
Sumbu z positif meluas keluar dari layar perangkat, seperti yang ditunjukkan pada gambar berikut.
Dalam diagram berikut, orientasi perangkat dan tampilan berada di Lanskap (sumbu sensor yang ditampilkan khusus untuk orientasi lanskap).
Diagram ini menunjukkan orientasi tampilan dan perangkat di Lanskap.
Diagram berikutnya ini menunjukkan tampilan dan orientasi perangkat di LandscapeFlipped.
Diagram akhir ini menunjukkan orientasi tampilan di Lanskap saat orientasi perangkat adalah LandscapeFlipped.
Anda dapat mengkueri nilai orientasi melalui kelas DisplayInformation dengan menggunakan metode GetForCurrentView dengan properti CurrentOrientation. Kemudian Anda dapat membuat logika dengan membandingkan dengan enumerasi DisplayOrientations. Ingatlah bahwa untuk setiap orientasi yang Anda dukung, Anda harus mendukung konversi sumbu referensi ke orientasi tersebut.
Perangkat yang mengutamakan lanskap vs potret
Produsen menghasilkan perangkat yang mengutamakan lanskap dan potret-pertama. Bingkai referensi bervariasi antara perangkat yang mengutamakan lanskap (seperti desktop dan laptop) dan perangkat yang mengutamakan potret (seperti ponsel dan beberapa tablet). Tabel berikut menunjukkan sumbu sensor untuk perangkat yang mengutamakan lanskap dan potret-pertama.
Orientasi | Lanskap-pertama | Potret-pertama |
---|---|---|
Lanskap | ||
Potret | ||
LandscapeFlipped | ||
PortraitFlipped |
Perangkat menyiarkan layar dan perangkat tanpa kepala
Beberapa perangkat memiliki kemampuan untuk menyiarkan layar ke perangkat lain. Misalnya, Anda dapat mengambil tablet dan menyiarkan tampilan ke proyektor yang akan berada dalam orientasi lanskap. Dalam skenario ini, penting untuk diingat bahwa orientasi perangkat didasarkan pada perangkat asli, bukan yang menyajikan layar. Jadi akselerometer akan melaporkan data untuk tablet.
Selain itu, beberapa perangkat tidak memiliki tampilan. Dengan perangkat ini, orientasi default untuk perangkat ini adalah potret.
Menampilkan orientasi dan judul kompas
Judul kompas tergantung pada sumbu referensi dan berubah dengan orientasi perangkat. Anda mengimbangi berdasarkan tabel ini (asumsikan pengguna menghadap ke utara).
Menampilkan orientasi | Sumbu referensi untuk judul kompas | JUDUL kompas API saat menghadap ke utara (landscape-first) | API compass heading saat menghadap ke utara (portrait-first) | Kompensasi judul kompas (landscape-first) | Kompensasi judul kompas (potret-pertama) |
---|---|---|---|---|---|
Lanskap | Z- | 0 | 270 | Heading | (Judul + 90) % 360 |
Potret | Y | 90 | 0 | (Judul + 270) % 360 | Heading |
LandscapeFlipped | Z | 180 | 90 | (Judul + 180) % 360 | (Judul + 270) % 360 |
PortraitFlipped | Y | 270 | 180 | (Judul + 90) % 360 | (Judul + 180) % 360 |
Ubah judul kompas seperti yang ditunjukkan dalam tabel untuk menampilkan judul dengan benar. Cuplikan kode berikut menunjukkan cara melakukan ini.
private void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
{
double heading = e.Reading.HeadingMagneticNorth;
double displayOffset;
// Calculate the compass heading offset based on
// the current display orientation.
DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
switch (displayInfo.CurrentOrientation)
{
case DisplayOrientations.Landscape:
displayOffset = 0;
break;
case DisplayOrientations.Portrait:
displayOffset = 270;
break;
case DisplayOrientations.LandscapeFlipped:
displayOffset = 180;
break;
case DisplayOrientations.PortraitFlipped:
displayOffset = 90;
break;
}
double displayCompensatedHeading = (heading + displayOffset) % 360;
// Update the UI...
}
Menampilkan orientasi dengan akselerometer dan gyrometer
Tabel ini mengonversi data akselerometer dan gyrometer untuk orientasi tampilan.
Sumbu referensi | X | Y | Z |
---|---|---|---|
Lanskap | X | Y | Z |
Potret | Y | -X | Z |
LandscapeFlipped | -X | -Y | Z |
PortraitFlipped | -Y | X | Z |
Contoh kode berikut menerapkan konversi ini ke gyrometer.
private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
double x_Axis;
double y_Axis;
double z_Axis;
GyrometerReading reading = e.Reading;
// Calculate the gyrometer axes based on
// the current display orientation.
DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
switch (displayInfo.CurrentOrientation)
{
case DisplayOrientations.Landscape:
x_Axis = reading.AngularVelocityX;
y_Axis = reading.AngularVelocityY;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.Portrait:
x_Axis = reading.AngularVelocityY;
y_Axis = -1 * reading.AngularVelocityX;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.LandscapeFlipped:
x_Axis = -1 * reading.AngularVelocityX;
y_Axis = -1 * reading.AngularVelocityY;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.PortraitFlipped:
x_Axis = -1 * reading.AngularVelocityY;
y_Axis = reading.AngularVelocityX;
z_Axis = reading.AngularVelocityZ;
break;
}
// Update the UI...
}
Menampilkan orientasi dan orientasi perangkat
Data OrientationSensor harus diubah dengan cara yang berbeda. Anggaplah orientasi yang berbeda ini sebagai rotasi berlawanan arah jarum arah dengan sumbu z, jadi kita perlu membalikkan rotasi untuk mendapatkan kembali orientasi pengguna. Untuk data kuaternion, kita dapat menggunakan rumus Euler untuk menentukan rotasi dengan kuaternion referensi, dan kita juga dapat menggunakan matriks rotasi referensi.
Untuk mendapatkan orientasi relatif yang Anda inginkan, kalikan objek referensi terhadap objek absolut. Perhatikan bahwa matematika ini tidak komutatif.
Dalam ekspresi sebelumnya, objek absolut dikembalikan oleh data sensor.
Menampilkan orientasi | Rotasi berlawanan arah jajaran jajarannya di sekitar Z | Kuaternion referensi (rotasi terbalik) | Matriks rotasi referensi (rotasi terbalik) |
---|---|---|---|
Lanskap | 0 | 1 + 0i + 0j + 0k | [1 0 0 0 1 0 0 0 1] |
Potret | 90 | cos(-45⁰) + (i + j + k)*sin(-45⁰) | [0 1 0 -1 0 0 0 0 1] |
LandscapeFlipped | 180 | 0 - i - j - k | [1 0 0 0 1 0 0 0 1] |
PortraitFlipped | 270 | cos(-135⁰) + (i + j + k)*sin(-135⁰) | [0 -1 0 1 0 0 0 0 1] |