センサーの向き
Accelerometer、Gyrometer、Compass、Inclinometer、および OrientationSensor クラスからのセンサー データは、参照軸によって定義されます。 これらの軸は、デバイスの参照フレームによって定義され、ユーザーが回転するとデバイスと共に回転します。 アプリが自動回転をサポートし、ユーザーがデバイスを回転させる際にデバイスに合わせて向きを変更する場合は、使用する前に、回転に合わせてセンサー データを調整する必要があります。
重要な API
ディスプレイの向きとデバイスの向き
センサーの参照軸を理解するには、ディスプレイの向きとデバイスの向きを区別する必要があります。 表示の向きは方向テキストであり、画像は画面に表示され、デバイスの向きはデバイスの物理的な位置です。
Note
次の図に示すように、正の z 軸はデバイス画面外に伸びています。
次の図では、デバイスとディスプレイの向きは共に横向きです (示されているセンサー軸は、横向き専用です)。
この図では、画面とデバイスの向きが共に Landscape で示されています。
次の図では、画面とデバイスの向きが共に LandscapeFlipped で示されています。
最後の図では、画面の向きが Landscape であるのに対し、デバイスの向きは LandscapeFlipped です。
CurrentOrientation プロパティを使用して、GetForCurrentView メソッドを使用して、DisplayInformation クラスを使用して方向の値を照会できます。 その後、 DisplayOrientations 列挙型と比較してロジックを作成できます。 サポートする方向ごとに、参照軸からその方向への変換をサポートする必要があります。
横優先デバイスと縦優先デバイス
製造元は、横向き優先デバイスと縦向き優先デバイスの両方を生成します。 参照フレームは、横向き優先デバイス (デスクトップやノート PC など) と縦向き優先デバイス (携帯電話や一部のタブレットなど) によって異なります。 次の表は、横向き優先デバイスと縦優先デバイスの両方のセンサー軸を示しています。
オリエンテーション | 横優先 | 縦優先 |
---|---|---|
横 | ||
縦 | ||
LandscapeFlipped | ||
PortraitFlipped |
ディスプレイおよびヘッドレス デバイスをブロードキャストするデバイス
一部のデバイスには、ディスプレイを別のデバイスにブロードキャストする機能があります。 たとえば、タブレットを使用して、横向きのプロジェクターにディスプレイをブロードキャストできます。 このシナリオでは、デバイスの向きは、ディスプレイを表示するデバイスではなく、元のデバイスに基づいていることに注意することが重要です。 そのため、加速度計はタブレットのデータを報告します。
さらに、一部のデバイスにはディスプレイがありません。 これらのデバイスでは、これらのデバイスの既定の向きは縦向きです。
表示の向きとコンパスの見出し
コンパスの見出しは参照軸に依存するため、デバイスの向きに応じて変化します。 このテーブルに基づいて補正します (ユーザーが北に向いていると仮定します)。
表示の向き | コンパスの見出しの参照軸 | 北に向かう場合の API コンパスの見出し (横優先) | 北に向かう場合の API コンパスの見出し (縦優先) | コンパスの見出し補正 (横向き優先) | コンパスの見出し補正 (縦優先) |
---|---|---|---|---|---|
横 | Z- | 0 | 270 | [Heading] (方向) | (見出し + 90) % 360 |
縦 | 年 | 90 | 0 | (見出し + 270) % 360 | [Heading] (方向) |
LandscapeFlipped | Z | 180 | 90 | (見出し + 180) % 360 | (見出し + 270) % 360 |
PortraitFlipped | 年 | 270 | 180 | (見出し + 90) % 360 | (見出し + 180) % 360 |
正しく見出しを表示するには、表に示すようにコンパスの見出しを変更します。 次のコード スニペットは、これを行う方法を示しています。
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...
}
加速度計とジャイロメーターを使用して向きを表示する
次の表は、加速度計とジャイロメーターのデータを表示方向に変換します。
参照軸 | x | 年 | Z |
---|---|---|---|
横 | x | 年 | Z |
縦 | 年 | X- | Z |
LandscapeFlipped | X- | -y | Z |
PortraitFlipped | -y | x | Z |
次のコード例では、これらの変換をジャイロメーターに適用します。
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...
}
ディスプレイの向きとデバイスの向き
OrientationSensor データは、別の方法で変更する必要があります。 これら複数の向きを Z 軸に対する反時計回りの回転を考えてみます。この場合、ユーザーの向きを元に戻すには、回転を逆にする必要があります。 四元数データの場合、Euler の数式を使用して、参照四元数を持つ回転を定義し、参照回転行列を使用することもできます。
目的の相対方向を取得するには、参照オブジェクトを絶対オブジェクトに乗算します。 この数学は可換ではないことに注意してください。
前の式では、センサー データによって絶対オブジェクトが返されます。
表示の向き | Z 回りの反時計回りの回転 | 参照四元数 (逆回転) | 参照回転行列 (逆回転) |
---|---|---|---|
横 | 0 | 1 + 0i + 0j + 0k | [1 0 0 0 1 0 0 0 1] |
縦 | 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] |