다음을 통해 공유


모다의 윈도우폰7 뚝딱 팩토리(10)-가속도계(중력센서) 사용하기

 

 

한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 열번째 영상!

윈도우폰 표준안에는 중력센서라고도 알려져 있는 ‘가속도계(accelerometer)’가 탑재되어있습니다. 이 센서를 통해 지금 휴대폰이 제대로 서 있는지, 아니면 눕혀있는지 상태를 체크할 수 있고, 조금 더 재미있는 기능을 만들자면 이 값의 변화를 감지해서 흔들고 있는지, 아니면 충둘이 일어났는지를 확인할 수도 있습니다. 현재 우리가 하고 있는 다양한 자동차 게임 역시 이 가속도계를 사용하여 구현되어있지요. 활용하기에 따라 다양하고 기발한 어플리케이션을 만들 수도 있습니다.

폰이 눕혀있는 상태가 가로, 세로, 앞뒤가 있기 때문에 3차원 좌표계를 사용하며, 상태 측정 자체는 비교적 간단하지만 실제 어플리케이션을 개발하고 활용하실 때는 약간 머리아픈(!) 3차원 좌표계 관련 연산과 삼각함수같은 수학적 연산을 활용 해 주셔야 하는 경우가 종종 발생합니다. 아니면 다음과 같은 트릭을 생각 해 볼 수도 있지요

 

 // pseudo code
 double accel = e.X;
 double velocity += accel;
 position += velocity;

 

어떤 기능을 하는 코드인지 감이 잡히시나요? 이 코드는 폰을 기울임에 따라 기운 방향으로 가속도가 증가하며 변화하는 위치를 결정하는 간단한 트릭코드입니다. 실제 물리시간에 배울 때 위치와 가속도의 관계는 제곱이나 루트 등을 사용해서 매우 복잡하게 계산합니다만, 이 코드에서는 단순한 덧셈 연산 몇 번으로 해결하였지요. 실제로 이렇게 계산하면 어플리케이션의 performance 개선에도 도움이 됩니다.^^

 

가속도계는 재미있는 기능이지만 이 기능 역시 에뮬레이터에서 제대로 동작하지 않기 때문에 정확한 디버깅을 하려면 개발자 등록이 되어있는 실제 기기가 필요합니다. 이번화에서도 실제기기에서 동작하는 모습을 영상으로 짤막하게 담았습니다.

 

    1:  using System;
    2:  using System.Collections.Generic;
    3:  using System.Linq;
    4:  using System.Net;
    5:  using System.Windows;
    6:  using System.Windows.Controls;
    7:  using System.Windows.Documents;
    8:  using System.Windows.Input;
    9:  using System.Windows.Media;
   10:  using System.Windows.Media.Animation;
   11:  using System.Windows.Shapes;
   12:  using Microsoft.Phone.Controls;
   13:   
   14:  using Microsoft.Devices.Sensors;
   15:   
   16:  namespace Accelerometer01
   17:  {
   18:      public partial class MainPage : PhoneApplicationPage
   19:      {
   20:          Accelerometer acc;
   21:   
   22:          // Constructor
   23:          public MainPage()
   24:          {
   25:              InitializeComponent();
   26:   
   27:              acc = new Accelerometer();
   28:              acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);
   29:              acc.Start();
   30:          }
   31:   
   32:          void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
   33:          {
   34:              // throw new NotImplementedException();
   35:              // non-UI 스레드에서 UI 스레드 제어를 하기 위한 코드
   36:              Deployment.Current.Dispatcher.BeginInvoke(() => accChanged(e));
   37:          }
   38:   
   39:          void accChanged(AccelerometerReadingEventArgs e)
   40:          {
   41:              //throw new NotImplementedException();
   42:              textBlock1.Text = "X: " + e.X.ToString("0.0") +Environment.NewLine
   43:                  + "Y: " + e.Y.ToString("0.0") + Environment.NewLine
   44:                  + "Z: " + e.Z.ToString("0.0") + Environment.NewLine;
   45:          }
   46:      }
   47:  }