Motion APIについて一言







コード名「Mango」で広く知られているWindows Phone 7.5の新しいバージョンと一緒に、開発者は、GPSと加速度計、ジャイロスコープ、コンパス(または磁力計)に加えて、アプリケーションに使用することができました。 Motion APIと呼ばれるAPIセットも利用可能になりました。これは、すべてのセンサーからのデータを組み合わせて、空間内の位置とデバイスの動きの特性の形で処理結果を生成します。 Motion APIはMicrosoft Researchの成果であり、Windows Phoneのすべての開発者が使用できるようになりました。



デバイスでは、加速度計に加えて、少なくともコンパスが必要なMotion APIを利用できることに注意してください。



このAPIはMicrosoft.Devices.Sensors名前空間で利用可能で、デバイス上の他のすべてのセンサーと同様に機能するため、モーションセンサーに関する言及を見つけることもできます。

Motion APIを使用する簡単な例に移る前に、受信できるデータを確認しましょう。

姿勢により、さまざまな表現で空間内のデバイスの位置を取得できます。 さらに、DeviceAcceleration-デバイスの線形加速を取得できます。 DeviceRotationRate-デバイスの回転速度、重力-重力ベクトル。



ご覧のとおり、Motion APIは、拡張現実アプリケーションを作成したり、アプリケーションのデータソースとしてデバイスセンサーを積極的に使用したりするために必要なすべての情報を提供します。



簡単な例に移りましょう。 プログラムを開始した後、Pitch、Roll、Yawの値を矢印の回転として表示します。



これを行うには、Windows Phoneアプリケーションテンプレートから新しいプロジェクトを作成し、矢印を使用してXAMLスタートページにコードを配置し、プロジェクト名とページ名も変更します。 矢印を回転させるには、投影の機能を使用します-矢印を適切な量だけ回転させます。 したがって、矢印を表す各XAMLポリラインオブジェクトにProjectionを追加し、適切に名前を付けます。



結果のXAMLコードを以下に示します。

<!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text=" WINDOWS PHONE" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="motion api" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Name="MotionNotPresented" Text="    Motion API" FontSize="22" Visibility="Collapsed"></TextBlock> <Polyline Name="ArrowPitch" HorizontalAlignment="Center" VerticalAlignment="Center" Points="0,0 -10,150 0,140 10,150 0,0" Stroke="Green" StrokeThickness="2" Fill="Green" Margin="-300 -300 0 0"> <Polyline.Projection> <PlaneProjection x:Name="MotionPitchProjection"></PlaneProjection> </Polyline.Projection> </Polyline> <Polyline Name="ArrowRoll" HorizontalAlignment="Center" VerticalAlignment="Center" Points="0,0 -10,150 0,140 10,150 0,0" Stroke="Yellow" StrokeThickness="2" Fill="Yellow" Margin="300 -300 0 0"> <Polyline.Projection> <PlaneProjection x:Name="MotionRollProjection"></PlaneProjection> </Polyline.Projection> </Polyline> <Polyline Name="ArrowYaw" HorizontalAlignment="Center" VerticalAlignment="Center" Points="0,0 -10,150 0,140 10,150 0,0" Stroke="Red" StrokeThickness="2" Fill="Red"> <Polyline.Projection> <PlaneProjection x:Name="MotionYawProjection"></PlaneProjection> </Polyline.Projection> </Polyline> <TextBlock Height="50" HorizontalAlignment="Left" Margin="25,250,0,0" Text="Pitch" VerticalAlignment="Top" FontWeight="Bold" Foreground="Green" FontSize="40" /> <TextBlock FontSize="40" FontWeight="Bold" Foreground="Yellow" Height="50" HorizontalAlignment="Right" Margin="0,250,45,0" Text="Roll" VerticalAlignment="Top" /> <TextBlock FontSize="40" FontWeight="Bold" Foreground="Red" Height="50" HorizontalAlignment="Left" Margin="185,396,0,0" Text="Yaw" VerticalAlignment="Top" /> </Grid>
      
      







便宜上、矢印署名に追加し、デバイスでMotion APIが使用できないことを示すテキストを追加しました。



次に、プロジェクトにMicrosoft.Devices.Sensorsへの参照を追加し、コードブロックの使用に名前空間を追加する必要があります。
 using Microsoft.Devices.Sensors;
      
      







APIの可用性を確認し、初期化して、Loadedイベントハンドラーにデータ変更ハンドラーを登録します。

 Motion motion = null; // Constructor public MainPage() { InitializeComponent(); this.Loaded += new RoutedEventHandler(MainPage_Loaded); } void MainPage_Loaded(object sender, RoutedEventArgs e) { if (Motion.IsSupported) { motion = new Motion(); motion.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<MotionReading>>(motion_CurrentValueChanged); motion.Start(); } else MotionNotPresented.Visibility = Visibility.Visible; }
      
      







motion_CurrentValueChangedハンドラーで、データを受け取り、矢印をZ軸の周りに回転させます。

 void motion_CurrentValueChanged(object sender, SensorReadingEventArgs<MotionReading> e) { Dispatcher.BeginInvoke(() => { MotionPitchProjection.RotationZ = e.SensorReading.Attitude.Pitch * 180 / Math.PI; MotionRollProjection.RotationZ = e.SensorReading.Attitude.Roll * 180 / Math.PI; MotionYawProjection.RotationZ = e.SensorReading.Attitude.Yaw * 180 / Math.PI; }); }
      
      







これで、コンパスを備えたデバイス、できればコンパスとジャイロスコープを備えたデバイスがある場合は、例をテストできます。 残念ながら、エミュレータはコンパスまたはジャイロスコープをエミュレートしないため、Motion APIは使用できません。



便利なリンク:

シンプルな拡張現実アプリケーションの作成

MSDNのWindows Phone開発センター

Windows Phone SDK 7.1

ロシア語でのWindows Phone開発フォーラム



All Articles