센서 방향

Accelerometer, Gyrometer의 센서 데이터 Compass, InclinometerOrientationSensor 클래스는 참조 축으로 정의됩니다. 이러한 축은 디바이스의 참조 프레임에 의해 정의되며 사용자가 회전할 때 디바이스와 함께 회전합니다. 앱이 자동 회전을 지원하고 사용자가 회전할 때 디바이스를 수용할 수 있도록 자체 방향을 다시 지정하는 경우 센서 데이터를 사용하기 전에 회전에 맞게 조정해야 합니다.

디스플레이 방향 및 디바이스 방향

센서의 참조 축을 이해하려면 디스플레이 방향을 디바이스 방향과 구분해야 합니다. 표시 방향은 텍스트 방향이며 이미지는 화면에 표시되는 반면 디바이스 방향은 디바이스의 물리적 위치입니다.

메모

양수 z축은 다음 이미지와 같이 디바이스 화면에서 확장됩니다. 노트북용 Z축

다음 다이어그램에서 디바이스와 디스플레이 방향은 모두 Landscape(표시된 센서 축은 가로 방향과 관련됨)입니다.

이 다이어그램은 Landscape 디스플레이 및 디바이스 방향을 모두 보여줍니다.

디스플레이 및 기기 방향(가로)

다음 다이어그램은 LandscapeFlipped 디스플레이 및 디바이스 방향을 모두 보여줍니다.

LandscapeFlipped의 디스플레이 및 디바이스 방향

이 최종 다이어그램은 디바이스 방향이 LandscapeFlipped 동안 가로의 표시 방향을 보여줍니다.

디바이스 방향이 LandscapeFlipped인 동안 가로 방향 표시

DisplayInformation 클래스를 통해 GetForCurrentView 메서드와 CurrentOrientation 속성을 사용하여 방향 값을 쿼리할 수 있습니다. 그런 다음 DisplayOrientations 열거형과 비교하여 논리를 만들 수 있습니다. 지원하는 모든 방향에 대해 참조 축을 해당 방향으로 변환하도록 지원해야 합니다.

가로 우선 및 세로 우선 디바이스

제조업체는 가로 우선 디바이스와 세로 우선 디바이스를 모두 생산합니다. 참조 프레임은 가로 우선 기기(예: 데스크톱과 노트북)와 세로 우선 기기(예: 휴대폰과 일부 태블릿)에 따라 달라집니다. 다음 표는 가로 우선 장치와 세로 우선 장치의 센서 축을 보여줍니다.

오리엔테이션 가로 우선 세로 우선
풍경 가로 방향인 가로 우선 기기 가로 방향의 세로 우선 디바이스
초상화 세로 방향인 가로 우선 장치 세로 방향인 세로 우선 기기
LandscapeFlipped LandscapeFlipped 방향의 가로 우선 디바이스 LandscapeFlipped 방향의 세로 우선 디바이스
PortraitFlipped PortraitFlipped 방향의 가로 우선 디바이스 PortraitFlipped 상태의 세로 우선 기기

디스플레이 및 헤드리스 디바이스를 브로드캐스트하는 디바이스

일부 디바이스는 디스플레이를 다른 디바이스로 브로드캐스트할 수 있습니다. 예를 들어 태블릿을 사용하여 디스플레이를 가로 방향의 프로젝터로 브로드캐스트할 수 있습니다. 이 시나리오에서는 디바이스 방향이 디스플레이를 표시하는 디바이스가 아니라 원래 디바이스를 기반으로 한다는 점을 명심해야 합니다. 따라서 가속도계는 태블릿에 대한 데이터를 보고합니다.

또한 일부 장치에는 디스플레이가 없습니다. 이 디바이스들의 기본 방향은 세로 모드입니다.

방향 및 나침반 머리글 표시

나침반 제목은 참조 축에 따라 달라지므로 디바이스 방향에 따라 변경됩니다. 이 테이블을 기준으로 보정합니다(사용자가 북쪽을 향하고 있다고 가정).

표시 방향 나침반 방위의 기준 축 북쪽을 향할 때의 API 나침반 방향(가로 우선) 북쪽을 향하고 있을 때의 API 나침반 방위각(세로 우선) 나침반 방위 보정(가로 우선) 나침반 방위 보정 (세로 모드 우선)
풍경 -Z 0 270 제목 (제목 + 90) % 360
초상화 Y 90 0 (제목 + 270) % 360 제목
LandscapeFlipped Z 180 90 (헤딩 + 180) % 360 (제목 + 270) % 360
PortraitFlipped Y 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 Y Z
풍경 X Y Z
초상화 Y -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]

참고하십시오

동작 및 방향 센서 통합