18.4K Views
December 19, 23
スライド概要
「Mobile勉強会 Wantedly × チームラボ × Sansan #12」での発表資料です。
https://sansan.connpass.com/event/303229/
フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰
ARKit in visionOS アレはVision Proで実現できるのか 堤 修一(@shu223)
自己紹介 • 堤 修一 • @shu223 (GitHub, Qiita, Zenn, note, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):
ARKit in visionOSのサンプル集 Apple公式の ARKit in visionOSチュートリアル を 実際に動くア プリとして実装 したサンプル: github.com/shu223/visionOS-Sampler
本日のアジェンダ • visionOSにおけるARKitがiOSでどう変わったか • visionOSで「アレ」は実現できるのか
visionOSアプリの作り方 • Swift, SwiftUIを使って書ける • 同じコードベースでiOS / visionOS両リリースも可能 • iOSのほとんどのフレームワークはvisionOSでも使える • 例: Core ML, Core Bluetooth, Vision, etc...
visionOSで使えないフレームワーク 1 ActivityKit AdSupport AppClip AutomatedDeviceEnrollment BusinessChat CarKey CarPlay Cinematic ClockKit CoreLocationUI CoreMediaIO CoreNFC CoreTelephony DeviceActivity DockKit ExposureNotification FamilyControls FinanceKit FinanceKitUI ManagedSettings ManagedSettingsUI Messages MLCompute NearbyInteraction OpenAL ProximityReader RoomPlan SafetyKit ScreenTime SensorKit ServiceManagement Social Twitter WidgetKit WorkoutKit 1 Bringing your existing apps to visionOS | Apple Developer Documentation
(当然)ARKitも使える
iOSでARKitやってたし余裕!
✋
iOSでのARKitの平面検出のコード // セッションのコンフィギュレーションを生成 let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] // セッション開始 sceneView.session.run(configuration)
iOSでのARKitの平面検出のコード // アンカーが追加されるとデリゲートメソッドが呼ばれる func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { // コンフィギュレーションに応じたアンカーが得られる } guard let planeAnchor = anchor as? ARPlaneAnchor else { ... } ...
iOSでのARKitの平面検出のコード // セッションのコンフィギュレーションを生成 let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal, .vertical] ⚠ ARWorldTrackingConfiguration ・・・visionOSでは 使えない(ARConfiguration 自体が使えない)
iOSでのARKitの平面検出のコード // セッション開始 sceneView.session.run(configuration) ⚠ ARSCNView ・・・visionOSで使えない ARSession ・・・同上
iOSでのARKitの平面検出のコード // アンカーが追加されるとデリゲートメソッドが呼ばれる func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { // コンフィギュレーションに応じたアンカーが得られる } guard let planeAnchor = anchor as? ARPlaneAnchor else { ... } ... ⚠ ARSCNViewDelegate ・・・visionOSで使えない ARAnchor, ARPlaneAnchor ・・・同上
⚠ ARKit in iOSのAPIはほぼ使えない
visionOSでの平面検出のコード // セッションとDataProviderの初期化 let session = ARKitSession() let provider = PlaneDetectionProvider( alignments: [.horizontal, .vertical] ) // セッション開始 try await session.run([provider])
visionOSでの平面検出のコード // Data Providerからアンカーが得られる for await update in provider.anchorUpdates { let planeAnchor = update.anchor ... }
すべてvisionOS専用の新API
どう変わったのか?
// iOS: ARSession session.run(configuration) // visionOS: ARKitSession try await session.run([provider])
// iOS: ARSession session.run(configuration) // visionOS: ARKitSession try await session.run([provider]) どちらもrunやstopといったメソッドを持つ
// iOS: ARSession session.run(configuration) // ARConfigurationを渡す // visionOS: ARKitSession try await session.run([provider]) // DataProviderを渡す
• ARKitSession (visionOS)も ARSession (iOS)もどち らもセッションを管理 • 使い方も限りなく似ている • Anchor (visionOS)と ARAnchor (iOS)もだいたい似た ようなもの 2 2 visionOSにおけるARKitはiOS版とどう変わったか
どうしてこうなった... • 同じ機能なのに... • 実装もだいたい似たようなもんなのに... 同じAPIにしといた方がiOSとコードを共通化できて良かったの では...?
ARKit in visionOSの「気持ち」を理解する
ポイントその1: Vision ProにおいてARKitの機能は常時ON
Debug Visualization機能 • Xcode 15.1 beta の機能 • visionOSの諸々を可視化してくれる
Debug Visualization を有効にして色々見てみると...
ARKitの機能は常時ON • アプリがARKitの機能を使っていよう といまいと、World TrackingやScene Understandingが常時行われている • ハンドトラッキングも同様
ポイントその2: プライバシー
ARKitとプライバシー ARKitは、ユーザー許可なしにアプリに データを提供しない
プライバシーとData Provider ユーザーが拒否しているデータを提供す るData Providerでセッション実行しよ うとすると、セッションが失敗する
• Vision ProはいうなればARKitデバイス • アプリ開発者がARKit機能を制御するのではなく、常時動 いている • プライバシーへの配慮 • データを不用意には開発者に渡さない
// iOS: // Configurationで「使いたいARKit機能を構成」 session.run(configuration) // visionOS: // Data Providerを通じて「使いたいARKitデータにアクセス」 try await session.run([provider])
ここまでのまとめ • ARKit in visionOSはiOSとはまったく違うAPI群を使う • その設計思想は、Vision ProがARKitデバイスであると考える と腑に落ちる
〜アレはVision Proで実現できるのか〜
(たぶん多くの開発者が)やりたいこと • プロフィールデータを人の頭上に表 示したり • モノの情報やインストラクションを 表示したり
ARKit in iOS • People Occulusion • Pose Detection • Face Tracking • Object Detection • フレーム画像に対してCore ML利用 いくらでも手段がある
ARKit in visionOS • People Occulusion • Pose Detection • Face Tracking • Object Detection • フレーム画像に対してCore ML利用 どれも不可 4 4 壁や天井等の「面」を検出し種別を特定することは可能
苦肉の策 • DeviceAnchorを利用 • BLEやUWB等の位置推定技術を利用 • マイクアレイによる音源方向推定
DeviceAnchorを利用 DeviceAnchor The position and orientation of Apple Vision Pro. • 相手もVision Proを着けていれば位置・向きがわかる? • たぶん自分のしか取れない • 仮に他人のも取れるとして、「Vision Proを着けている人 だけ」は多くのユースケースに合わない
BLEやUWB等の位置推定技術を利用 • Core Bluetoothは利用可能 • オブジェクトを固定するほどの精度は期待できない • iBeaconのように「近付いたら〜する」程度のユースケー スが妥当 • Nearby Interactionは利用不可
マイクアレイによる音源方向推定 • Vision Proのマイクはモノラルなので無理そう
結論: visionOS 2.0 待ち 5 c.f. 今こそwatchOS 5
まとめ • ARKit in visionOSの新APIを理解するポイントは「Vision Pro はARKitデバイス」「プライバシーへの配慮」 • visionOS 1.0では人や物体に対してプロフィール等の何らか のオブジェクトを設置するユースケースは厳しそう