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
Menampilkan orientasi 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 dari layar perangkat, seperti yang ditunjukkan pada gambar berikut.
Dalam diagram berikut, baik orientasi perangkat maupun tampilan berada di Lanskap (sumbu sensor yang ditampilkan khusus untuk orientasi lanskap).
Diagram ini memperlihatkan tampilan dan orientasi 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 landscape-first vs portrait-first
Produsen menghasilkan perangkat lanskap-pertama dan potret-pertama. Bingkai referensi bervariasi antara perangkat lanskap-pertama (seperti desktop dan laptop) dan perangkat yang mengutamakan potret (seperti ponsel dan beberapa tablet). Tabel berikut menunjukkan sumbu sensor untuk perangkat landscape-first dan portrait-first.
Orientasi | Lanskap-pertama | Potret-pertama |
---|---|---|
Lanskap | ![]() |
![]() |
Potret | ![]() |
![]() |
LandscapeFlipped | ![]() |
![]() |
PortraitFlipped | ![]() |
![]() |
Perangkat menyiarkan tampilan dan perangkat tanpa kepala
Beberapa perangkat memiliki kemampuan untuk menyiarkan layar ke perangkat lain. Misalnya, Anda dapat mengambil tablet dan menyiarkan layar 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 sehingga berubah dengan orientasi perangkat. Anda mengimbangi berdasarkan tabel ini (asumsikan pengguna menghadap ke utara).
Menampilkan orientasi | Sumbu referensi untuk judul kompas | API compass heading saat menghadap ke utara (landscape-first) | JUDUL kompas API 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 diperlihatkan 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 girometer 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. Anggap orientasi yang berbeda ini sebagai rotasi berlawanan arah jarum arah ke 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 jakal 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] |