visionOS 26 におけるスタイラスやゲームコントローラへの対応について。コントローラには興味なかったが、近い将来 Apple Pencil が 6DoF 対応し、Vision Pro でも利用可能になる伏線と見てチェックした。
実は、XRコンテンツにおけるコントローラ/ハンドトラッキングの是非については過去にも(当時)Oculus Quest での体験をもとに考察したことがあった。
パススルーしない没入型VRコンテンツ内において、コンテンツへ対しての触覚やグリップ感を違和感なく表現するにはコントローラが優位だと考えた。ハンドジェスチャーにはその正確さや、触覚を伴う繊細なフィードバックに限界があるので(コントローラ一辺倒な体験設計は好ましくないだろうが)空間アクセサリを伴うユースケースの充実に期待したい。
0:00 – スタート
- visionOSでは「目と手」による入力が基本だが、より細かい制御、ボタン入力、触覚フィードバックを可能にする空間アクセサリのサポートを追加。
- サポートされるアクセサリ:
- PlayStation VR2 Sense controller: ゲームに適したボタン、ジョイスティック、トリガーを搭載。標準ジェスチャー(タップなど)でシステムナビゲーションも可能
- Logitech Muse: 先端とサイドボタンで可変入力が可能なフォースセンサーと強力な触覚フィードバックを搭載。生産性・クリエイティブアプリに適した精度
- アクセサリは full space アプリ、shared space アプリの両方で使用可能。
- Apple Vision Proのカメラとアクセサリのセンサーを組み合わせて位置と回転をトラッキング
2:41 – 彫刻アプリの構築
- セットアップ:
- Xcodeの機能エディタで「Spatial Gamepad」にチェックを入れて空間ゲームコントローラーサポートを追加
- アプリのplistで「Accessory Tracking Usage」の説明を記述(例:「Tracking accessory movements to carve into virtual clay」)
- アクセサリの接続:
- GameController フレームワークを使用して空間アクセサリとの接続を検出
GCController
(ゲームコントローラー)とGCStylus
(スタイラス)の両方がGCDevice
プロトコルに準拠。- 接続・切断イベントをリッスンし、
productCategory
が「Spatial Stylus」または「Spatial Controller」かどうかを確認
- 仮想コンテンツの表示:
- full space / shared space 両方で使え、プライバシー保護のため認証されたアプリのみ動き追跡可
AccessoryAnchoringSource
を作成し、アクセサリの「aim」位置にターゲットAnchorEntity
を作成し、accessory
ターゲット、aim 位置、トラッキングモードを指定- トラッキングモード:
predicted
: 低遅延だが急激な動きでオーバーシュートする可能性。continuous
: 高精度だが高遅延
- インタラクションの実装:
SpatialTrackingSession
に.accessory
を追加してアクセサリのAnchorEntity
のトランスフォームを取得。- 実装例
- アクセサリが粘土に入った時に素材を削除し、触覚フィードバックを発生
13:37 – ARKitによるアクセサリのトラッキング
- ARKit AccessoryAnchorの4つのプロパティ:
handedness
: アクセサリを握っている手(左/右)relativeMotion
: 空間内での相対的な動き。relativeRotationalMovement
: 空間内での相対的な回転運動。trackingState
: トラッキング品質(センサーやカメラのカバレッジが低下すると品質も低下)
- RealityKitとARKitの連携:
SpatialTrackingSession
が実行中で設定されている場合、RealityKitAnchorEntity
からARKit
AccessoryAnchor
を取得可能AnchorEntity
のARKitAnchorComponent
にアクセスし、ARKitAnchor
を取得してAccessoryAnchor
にキャスト
- リアクティブツールバーの表示:
- アクセサリアンカーからheld chirality(利き手)を取得。
- 左利きの場合は正のX方向、右利きの場合は負のX方向にツールバーを表示
14:45 – デザインに関する考慮事項
- UIとの相互作用:
- ビューにゲームコントローラー入力(ボタンやトリガー)をジェスチャーの代わりに受信するよう指示可能
- 標準の手ジェスチャーとゲームコントローラーの両方を入力として処理可能
- SwiftUIビューで
.receivesEventsInView
修飾子を設定してジェスチャーイベントも受信
- 没入感の向上:
- 完全空間アプリでは
.persistentSystemOverlays
APIでホームインジケーターを非表示 .upperLimbVisibility
APIで上肢とアクセサリを非表示
- 完全空間アプリでは
- 適応的サポート:
- 空間アクセサリと手の両方に対応することで、より多くのユーザーをサポート
- ARKit は今年さらに高速で手をネイティブトラッキング
- App Store バッジ:
- 「Spatial game controller support」: 空間アクセサリトラッキング付きゲームコントローラーをサポート
- 「Spatial game controller required」: 空間アクセサリトラッキング付きゲームコントローラーが必須