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. Z-axis for laptop

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.

Display and device orientation in Landscape

Diagram berikutnya ini menunjukkan tampilan dan orientasi perangkat di LandscapeFlipped.

Display and device orientation in LandscapeFlipped

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

Display orientation in Landscape while the device orientation is 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 Landscape-first device in Landscape orientation Portrait-first device in Landscape orientation
Potret Landscape-first device in Portrait orientation Portrait-first device in Portrait orientation
LandscapeFlipped Landscape-first device in LandscapeFlipped orientation Portrait-first device in LandscapeFlipped orientation
PortraitFlipped Landscape-first device in PortraitFlipped orientation Portrait-first device in PortraitFlipped orientation

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.

Euler's formula

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

Multiply the reference object against the absolute object

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]

Lihat juga

Mengintegrasikan Sensor Gerakan dan Orientasi