Windows Phoneで始める拡張現実の世界
Upcoming SlideShare
Loading in...5
×
 

Windows Phoneで始める拡張現実の世界

on

  • 502 views

Windows Phoneのセンサーを使ったプログラミングの基礎をお話しし、実用例としての仮想現実アプリの動作原理を分かりやすくご紹介します。

Windows Phoneのセンサーを使ったプログラミングの基礎をお話しし、実用例としての仮想現実アプリの動作原理を分かりやすくご紹介します。

Statistics

Views

Total Views
502
Views on SlideShare
498
Embed Views
4

Actions

Likes
0
Downloads
1
Comments
0

2 Embeds 4

https://twitter.com 3
https://abs.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Windows Phoneで始める拡張現実の世界 Windows Phoneで始める拡張現実の世界 Presentation Transcript

  • Windows Phoneで始める拡張現実の世界2013.03.23初音玲
  • はじめに Microsoft MVP for 初音玲 Visual Basic (2008~) 最近はOracle ACE 「開発が分かる」 (2008~) クラウドインフラ屋
  • 書籍でました• VB2012本
  • Agenda• 拡張現実とは• Windows Phone 8について• WP7.1アプリとの互換性• 開発環境について• サンプルコード
  • 拡張現実とは
  • Wikipediaによれば• 英語の Augmented Realityの日本語訳であ るため、それを日本語発音した「オーグ メンテッド・リアリティ」や、省略形の ARも用いられる。また、拡張現実感とも 言う。• 拡張現実はバーチャルリアリティ(VR)の変 種であり、その時周囲を取り巻く現実環 境に情報を付加・削除・強調・減衰させ、 文字通り人間から見た現実世界を拡張す るものを指す。 バーチャルリアリティが 人工的に構築された現実感と現実を差し 替えるのに対し、拡張現実は現実の一部 を改変する技術である。
  • そこで• Windows Phoneのカメラビューで• 現実世界を映し• そこに情報を付与する
  • Windows Phone 8について
  • WP8対応機種• Nokia:Lumiaシリーズ• HTC:8X、8S• Smsung:ATIV S
  • 3つの画面解像度WVGA 800 x 480 15:9WXGA 1280 x 768 15:9720p 1280 x 720 16:9
  • Windows 8とコア共有(非完全)共通部分• カーネル、ネットワーク、グラフィック、 ファイルシステム、マルチメディア• ドライバモデル• Windowsと同等のマルチコア対応非共通部分• 同じAPIで開発できる× • 今後の新機能は基本的に共通化を考慮
  • Windows Phone 8 API WP 8.0 Games Direct X/Direct 3D & C++ WP 8.0 WP 8.0 XAML & VB/C# & Direct 3D XAML & C++ WP 8.0 WP 8.0 XAML & VB/C# XAML & C++ WP 7.1XNA & VB/C# WP7.1= Windows Phone OS 7.1 = Windows Phone 7.1/7.8 WP 7.1XAML & VB/C#.NET API for Windows Win32 & Windows Phone COM Phone Runtime (native) (managed) (managed/native)
  • .NET API for Windows Win32 & Windows Phone COM Phone Runtime• .NET API for Windows Phone • WP7.1にあるすべてのtypeとAPIを含む • System名前空間とMicrosoft.Phone名前空間• WP8.0追加API •Microsoft.Phone.Wallet •Microsoft.Phone.Tasks.ShareMediaTask •Microsoft.Phone.Tasks.MapsTask •Microsoft.Phone.Storage.ExternalStorage •Microsoft.Phone.Networking.Voip など
  • .NET API for Windows Win32 & Windows Phone COM Phone Runtime • Windows Phone Runtime (WinPRT) • WinRTのサブセット + Phone関連の追加Win RT • Phone関連の追加(約11,000メンバ) •音声合成と音声認識 •カスタム連絡先ストア •ロックスクリーン サブセット 追加 など (約2,800) (約600)
  • .NET APIとWinPRTで同等APIが存在.NET API Windows Phone Runtime APISystem.IO.IsolatedStorage Windows.StorateSystem.Net.Sockets Windows.Networking.SocketsSystem.Threading.ThreadPool Windows.System.Threading.ThreadPoolMicrosoft.Devices.Sensors Windows.Devices.Sensors • WP7.1とWP8.0をターゲットにする なら.NET API • WP8とW8でコード共有するなら WinPRT
  • WP7.1アプリとの互換性
  • WP7.1アプリとWindows Phone 8• WP7.1アプリはリコンパイルなしで WP8で動作可能• 完全コンパチではないので多少の違いはある WP7.1 WP8.0 WP8.0 WP7.1 App リコンパイル App App App Quirks• Quirksモードで動作 WP8.0 rumtime
  • WP7.1アプリをWP8.0用に変換する• WP7.1依存のコードがないか注意 • Quirksモードでの互換性維持の対象外• ソースコード非互換• バイナリ非互換
  • ソースコード非互換の例Item Windows Phone OS 8.0 Windows Phone OS 7.1IsolatedStorageFile.FileExi null が渡された場合、 falsestsメソッド ArgumentNullExceptionMutexクラス Mutex名には¥は使用不可 Mutex名に¥が指定される と実行時に別文字に変換 されて正常動作BeginRead , BeginWrite, 非同期実行 同期実行EndRead, EndWrite,Thread.CurrentCulture カルチャ変更は カルチャ変更はThread.CurrentUICulture 該当スレッドのみ影響 全スレッドに影響XmlSerializerクラス シリアル化された型には、 シリアル化された型の既 既定のコンストラクター 定のコンストラクターは が必要です。 必須ではありません。 その他の非互換については http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj206947.aspx
  • OSバイナリ非互換の例Item Windows Phone OS 8.0 Windows Phone OS 7.1Background File Transfers 同時転送ファイル数の制 同時転送ファイル数の制 限が25 限が5Networking Vary ヘッダーを処理して ダウンロードが 1 秒以上 応答をキャッシュするこ かかる前提は不可 とが可能Access to private nested private入れ子クラスは private入れ子クラスをclasses 未サポート サポート その他の非互換については http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj206947.aspx
  • 開発環境について
  • 開発環境の入手• Windows Phone Developer Center • 旧→ http://create.msdn.com • 新→ http://dev.windowsphone.com• SDKは無料• SDKの動作環境 • Windows 8 64bit版 • 最低4GBのメモリ• エミュレータ要件 • Windows 8 Pro以上 • SLAT対応ハード(Core iとか)
  • SLAT対応しているかを確認する• SysInternalsツール • http://technet.microsoft.com/en- us/sysinternals/cc835722• coreinfo –v • サポート EPT * • サポート外 EPT -
  • デベロッパーセンターアカウント• http://msdn.microsoft.com/ja- jp/library/windowsphone/help/jj206719.aspx• SDKを使うだけでは不要• 実機転送、ストア公開には必須• Microsoftアカウントに紐付け• 年間$99 • 有料アプリは無制限に登録可能 • 無料アプリは100個まで登録可能• 会社アカウント or 個人アカウント • 会社アカウントは登録が面倒 • 会社アカウントじゃないと使えない機能あり
  • Windows Phone エミュレータ• Win 8 Pro以上のHyper-Vで動作• 実機と同じ環境• Windows Phone SDKに同封• 位置情報や端末向きもエミュレート• エミュレータ環境設定 • ロックスクリーン • ネットワーク接続のシミュレーション
  • エミュレータを使う上での注意点• 実機よりも動作が速い可能性がある • 性能チェックは実機で要確認 • エミュレータは機能テスト用• プロファイリングツールを活用 • 実機とエミュレータに使用できる • http://wptools.codeplex.com/
  • エミュレータへのデプロイ• デプロイ先として選択• 最初にデプロイされると自動起動 • 停止するとローカルストレージの内容 は消える• エミュレータの論理スペック • WVGAで512MBメモリ • 解像度:720P、WVGA、WXGA
  • エミュレータの操作方法• ハードウェアボタンの操作 • F1:戻るボタン • F2:ホームボタン • F3:検索ボタン • F6:カメラボタン(半押し) • F7:カメラボタン(長押し) • F9:ボリュームアップ • F10:ボリュームダウン • F12:電源ボタン• マルチタッチ対応(要タッチ対応PC)• PgUp/PgDnでエミュレータキーボードとPC側 キーボードの切替
  • 向きのエミュレート 左回転 右回転
  • カメラ動作のエミュレート• 赤い四角が動き回る
  • 位置情報のエミュレート① 検索② ズーム③ ライブ操作On/Off④ ピンモードOn/Off⑤ すべてのポイントをクリア⑥ マップのポイントを保存⑦ 位置移動間隔(秒)⑧ すべてのポイントを再生
  • Additional Tools-Locationでのテスト• [ライブ]ボタンでライブモードOn 1. 検索ボックスで地名入力で検索 2. ピンモードをOn 3. マップをクリックしてピン追加 • PositiionChangedイベント発生• [ライブ]ボタンでライブモードOff 1. ピンモードをOn 2. マップをクリックしてピン追加 3. マップのポイントを保存 4. すべてのポイントを再生 • PositiionChangedイベント発生
  • ロックスクリーンのエミュレート• ロックスクリーン表示 • シミュレーションダッシュボードで設 定 • F12を2回押す
  • ネットワークのシミュレーション
  • スクリーンショットの保存• [キャプチャ]でキャプチャ• [保存]でPCのマイピクチャに保存
  • Visual Studioでのデバッグ• Windowsアプリと同じようデバッグ • ブレークポイント • ステップ実行 • 変数参照や値変更
  • Windows Phoneとの接続• Windows Phone OS 7.1 • Zune必須• Windows Phone 8.0 • Zune不要
  • 端末を開発用に登録する• 登録手順 1. WiFi接続/USBでPCと接続 2. Windows Phone Developer Registrationを起動 3. 「Click the Register button to unlock the phone」と表示されたら[Register] ボタンをクリック 4. デベロッパセンターアカウントに紐付 けたMicrosoftアカウントに[サインイ ン]• 登録できる端末は3台まで
  • 実機へデプロイ!• ターゲットを[Device]• 実行で実機にデプロイされて実行• エミュレータと同様のデバッグ可能• VSからデプロイできるのは10個まで • 開発が終わったアプリはストアから
  • 実機デバッグ• エミュレータと同じようデバッグ • ブレークポイント • ステップ実行 • 変数参照や値変更
  • 実機でのスクリーンショット保存• Windows Phone 8から可能• 電源とホームボタンの同時押し• 実機の[albums]-[screenshots]に保存
  • 国際化対応• WP8SDKで楽になった • 規定言語用にAppResources.resx • サポート言語追加 • AppResources.xx-xx.resxを自動生成• XAML上で • {Binding Path=LocalizedResources.[Key], Source={StaticResource LocalizedStrings}}• コード上で • AppResources.[key]http://msdn.microsoft.com/ja-jp/library/windowsphone/develop/ff637522.aspx
  • MDIL: Machine Dependent Intermediate Languageソース コンパイラ MSILコード 開発環境MDIL MDIL MSIL ストア コンパイラ Native NativeMDIL Image DLL 実行環境 Generetor
  • サンプルコード
  • カメラをコードで操作• レンズピッカー • ID_CAP_ISV_CAMERA • 標準カメラアプリのファインダーより入力して随時の操作結 果をファインダーに表示可能• Picture.GetPreviewImageメソッドでサムネイル画像を取 得可能• リッチメディアレンズ • ID_CAP_MEDIALIB_PHOTO • Photosハブにある写真に対するエフェクト機能を追加可能• バックグラウンドでの写真アップロード • バックグラウンドエージェントで自動アップロード可能• CameraAPI • PhotoCaptureDeviceクラスで、ISO、ホワイトバランス、露 出、ピントを制御 • AudioVideoCaptureDeviceクラスは、ビデオと録音に対して 同等の制御を提供
  • カメラビューの表示Dim res As Windows.Foundation.Size = SupportedResolutions(0)Me.Live = Await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, res)RaiseEvent Initialized(Nothing, Nothing)Imports Windows.Phone.Media.CapturePublic ReadOnly Property Live As PhotoCaptureDevice Get Return Me.VmLiveModel.Live End GetEnd Property<Rectangle Grid.Row="0" Stroke="Black" Margin="0,100,0,100"> <Rectangle.Fill> <VideoBrush x:Name="ViewfinderBrush"/> </Rectangle.Fill></Rectangle>Me.ViewfinderBrush.SetSource(Me.ViewModel.Live)
  • コンパス機能の追加Private WithEvents CompassWatcher As CompassMe.CompassWatcher = Compass.GetDefaultPrivate Sub ReadingChanged(sender As Compass, e As CompassReadingChangedEventArgs) _ Handles CompassWatcher.ReadingChanged Me.MagneticHeading = e.Reading.HeadingMagneticNorthEnd SubImports Windows.Devices.SensorsPublic ReadOnly Property MagneticHeading As Double Get Return Me.VmCompassModel.MagneticHeading End GetEnd Property
  • コンパス機能の追加<Grid x:Name="Compass_Grid" RenderTransformOrigin="0.5,0.5"> <es:RegularPolygon Stroke="{StaticResource PhoneAccentBrush}" StrokeThickness="3" InnerRadius="1" PointCount="3" Stretch="Fill" UseLayoutRounding="False" Width="160" Height="160" Margin="127.015,240,127.015,392.478"/> <Ellipse Width="320" Height="320" Stroke="{StaticResource PhoneAccentBrush}" StrokeThickness="3" /></Grid>Private Sub Compass_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _ Handles ViewModel.PropertyChanged Dispatcher.BeginInvoke( Sub() Dim g As New TransformGroup g.Children.Add(New RotateTransform With { .Angle = Me.ViewModel.MagneticHeading}) Me.Compass_Grid.RenderTransform = g End Sub)End Sub
  • 拡張現実っぽく見える演出• 端末を傾けると… • 見えている映像も視点が変わる • コンパスと映像の傾きが合わない• コンパスも傾くようにすると…
  • 傾きを反映Private WithEvents MotionWatcher As InclinometerMe.MotionWatcher = Inclinometer.GetDefaultPrivate Sub ReadingChanged(sender As Inclinometer, e As InclinometerReadingChangedEventArgs) _ Handles MotionWatcher.ReadingChanged Me.Pitch = e.Reading.PitchDegrees Me.Yaw = e.Reading.YawDegrees Me.Roll = e.Reading.RollDegreesEnd SubPublic ReadOnly Property Pitch As Single Get Return Me.VmMotionModel.Pitch End Get End Property Public ReadOnly Property Yaw As Single Get Return Me.VmMotionModel.Yaw End Get End Property ; ;
  • 傾きを反映<Grid x:Name="D3D_Grid" Grid.Row="0" RenderTransformOrigin="0.5,0.5"> <Grid x:Name="Compass_Grid" RenderTransformOrigin="0.5,0.5"> : </Grid></Grid>Private Sub Compass_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _ Handles ViewModel.PropertyChanged Dispatcher.BeginInvoke( Sub() Dim g As New TransformGroup g.Children.Add(New RotateTransform With { .Angle = Me.ViewModel.MagneticHeading}) Me.Compass_Grid.RenderTransform = g Me.D3D_Grid.Projection = New PlaneProjection With { .RotationX = Me.ViewModel.Pitch, .RotationY = Me.ViewModel.Roll} End Sub)End Sub
  • DemoPhotoARSample