Bagikan melalui


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. Sumbu Z untuk laptop

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.

Tampilan dan orientasi perangkat di Lanskap

Diagram berikutnya ini menunjukkan tampilan dan orientasi perangkat di LandscapeFlipped.

Tampilan dan orientasi perangkat di LandscapeFlipped

Diagram akhir ini menunjukkan orientasi tampilan di Lanskap saat orientasi perangkat adalah LandscapeFlipped.

Menampilkan orientasi 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 Perangkat lanskap-pertama dalam orientasi Lanskap Perangkat pertama potret dalam orientasi Lanskap
Potret Perangkat lanskap-pertama dalam orientasi Potret Perangkat pertama potret dalam orientasi Potret
LandscapeFlipped Perangkat lanskap-pertama dalam orientasi LandscapeFlipped Perangkat pertama potret dalam orientasi LandscapeFlipped
PortraitFlipped Perangkat pertama lanskap dalam orientasi PortraitFlipped Perangkat pertama potret dalam orientasi 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.

Rumus Euler

Untuk mendapatkan orientasi relatif yang Anda inginkan, kalikan objek referensi terhadap objek absolut. Perhatikan bahwa matematika ini tidak komutatif.

Mengalikan objek referensi terhadap objek absolut

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]

Lihat juga

Mengintegrasikan Sensor Gerakan dan Orientasi