visionOS TC 2025 にプロポーザルを提出した

昨夜こんな投稿をしたのだが、

ふと、Vision Pro で長らくやりたかったことを思い出したので、プロポーザルを出してみた。

空間コンピューティングでOne more repを切り拓けるか

筋トレやってますか?
人類は、トレーニングの質を日々追い求め、対内外、五感、科学的/非科学的を問わずあらゆる工夫を編み出してきました。
食事、サプリ、シューズやウェア、モチベーションソング・・・
しかし未踏の領域は、まだ我々に残されているように思います。それは視覚です。

Vision Pro を手にした今こそ、ジムの退屈な風景を疑ってみませんか?
空間コンピューティングを活かし、ポージングと連動して視覚・聴覚を演出強化することで、パフォーマンスは増強するのか。限界突破(One more rep)に与するのか。

人体実験を通して、身体の可能性とインターフェースの未来に迫ります。

書いてある通り、visionOS のポージングやハンドトラッキング技術を使った視覚演出により、精神面を補助し、トレーニングの限界を突破できるのではないか?というアイデアがある。これを実証するために実は昨年末、自宅用のダンベル・ベンチセットを購入したのだが、ただのタンスの肥やしになってしまっていた。

技術的な具体性が一切ないので受けは良くない気がしている。具体で書いたら、やりたいことが簡単にイメージできそうなのであえて避けたのと、そもそも現時点まだ何も作っていないので、方針変えた時に逃げられないのもある。

昨日からプロポーザル投稿が増えてなかったのと、現状オモシロ系がなかったので、空気を変えようと若干ネタに走ってみたが、、夜中のテンションで書き上げたので、明日朝読みなおしたら普通に後悔してそう泣

visionOS TC 2025 のプロポーザル募集が開始

CyberAgent の SATOSHI さんが前々から企画をアナウンスしていた visionOS TC 2025 のプロボーザル募集がいよいよ開始された。

プロポーザル一覧:https://fortee.jp/visionos-tc-2025/proposal/all

visionOS 関連でひとつ今年のうちに LT やりたいと思っていたが、まだ叶っていない。格好のチャンスではあるが、ここ最近は Foundation Models につきっきりで、新しいことを試せていなかった。

今年見た WWDC セッションの中で面白いネタがないか探してみた。Clipping Margins 外にコンテンツを配置できる挙動について気になっていたので、この辺で遊んでみるとか、、


今年初旬まで精力的に取り組んでおきながら、途中で投げ出し放置状態になっているあるアイデアがあるのだが、その中でハンドジェスチャーに呼応した物体表面を波打たせる演出を考えており、実現方法を SATOSHI さんに相談する機会があった。その際教えていただいた LowLevelMesh をまだ試せてないので、ちょっと遊んでみるか。

プロトタイプ

締切まであと2週間と少し。限られた時間だが、着地が見込めそうであれば応募しよう。(精力的にプロポーザル出す人たちって、どの程度の準備状態で挑んでいるんだろうか?)

WWDC25:Meet SwiftUI spatial layout

SwiftUI による 3D レイアウトについて。


0:00 – Introduction

  • visionOS 26 で SwiftUI の新しい Spatial Layout 機能について紹介
  • 既存の 2D レイアウトツールとアイデアを使って 3D アプリケーションを構築可能
  • アニメーション、リサイズ、状態管理の組み込みサポートを活用

2:47 – 3D views

  • visionOS では全ての View が 3D になり、width, height に加えて depth, Z position も計算される
  • カスタムの debugBorder3D modifier を用いて解説
  • Model3DImage と同様に固定の width, height, depth を持つ
  • Image, Color, Text などは depth が 0 で iOS と同様の動作
  • RealityViewGeometryReader3D は利用可能な depth を全て使用
    • 従来の SwiftUI と同じレイアウトシステム
  • scaledToFit3D モディファイアでアスペクト比を維持しながら 3D 空間にフィット可能
    • Window では width-height のアスペクト比はユーザー操作によって代わるが、奥行きの提案はウインドウで固定されている
    • Volume は深さもサイズ変更可能
  • ZStack の挙動

7:18 – Depth alignments

  • visionOS 26 で DepthAlignments が追加され、既存の Layout タイプを 3D View に適応
    • VStackLayout などで depthAlignment モディファイアを適用して深度方向の配置を制御 (e.g. VStackLayout().depthAlignment(.center)  {…)
    • front, center, back の標準的な depth alignment を提供
  • Custom Depth Alignment で DepthAlignmentID プロトコルに準拠した独自の配置を定義可能
    • e.g. .alignmentGuide(.customAlignment) { $0[DepthAlignment.center] }

11:41 – Rotation layout

  • rotation3DLayout モディファイアで View の回転をレイアウトシステムに反映
    • 従来の rotation3DEffect は視覚効果のみでレイアウトには影響しなかったが、rotation3DLayout はレイアウトも変更
  • 任意の角度と軸での回転をサポート
  • 例:カスタム実装の RadialLayout と組み合わせて 3D カルーセルを構築可能
  • 複数の rotation3DEffect を組み合わせて複雑な 3D 配置を実現

16:28 – Spatial containers

  • SpatialContainer で複数の View を同じ 3D 空間に配置(入れ子人形方式)
  • 3D alignment(bottomFront, topTrailingBack など)で配置を制御
  • 選択状態の表示や UI 要素の重ね合わせに活用
  • spatialOverlay で単一の View を別の View と同じ 3D 空間に重ねる
  • debugBorder3D modifier の実装方法
    • spatialOverlay で実装

WWDC25:Set the scene with SwiftUI in visionOS

シーン復元や物理空間との連携について。Clipping Margins でボリュームの領域外部にコンテンツを描画できるようになったのはありがたい。システム許容のマージン領域としてどんな値が取れるのか(たとえば床より下、天井より上、壁より向こうは許容されない?)が気になっている。

ユーザーの視点移動に応じたコンテンツの変化(onVolumeViewpointChange)も具体的にどのような情報の取れ方や、コンテンツへの活かし方が可能か実験してみたい。


0:00 – Introduction

  • visionOS 26 で追加された新しいシーン機能の概要を紹介
  • Window, Volume, Immersive Space の シーンタイプに追加されたAPI の解説

2:11 – Launching and locking

  • シーンのロックと復元(locking, restoration)API が追加され、物理空間の特定の部屋にウインドウやボリュームを固定できる(イマーシブ空間は復元されない)
    • ほとんどのユーザーが復元できることを望むため、シーン復元を優先するべき
    • 一時的、コンテンツ依存なUI、ワンタイムアクションなどには .restorationBehavior(.disabled) で復元を無効化可能
  • defaultLaunchBehavior でアプリ起動時に表示するウインドウを柔軟に制御できる
    • e.g. ウェルカム画面の表示
    • Info.plist Preferred Default Scene Session Role と起動ウィンドウの役割との一致が必要
      • e.g. Window Application Session Role 指定はボリュームが無視される
    • .defaultLaunchBehavior(.supressed)でアプリ再起動時の再表示を抑制
  • Unique Window で重複しないウインドウを作成可能
    • WindowGroupWindow

8:15 – Volumetric enhancements

  • surface snapping(物理環境へのスナップ)の対応
    • ウインドウは壁など垂直面に
    • ボリュームは机など水平面に
    • ウィジェットは垂直水平どちらも
    • surfaceSnappingInfo environment でスナップ状態を取得可能
      • isSnapped
      • ARKit によるスナップ表面の分類情報を取得可能
        • ユーザー許可が必要:Info.plist に設定
  • onVolumeViewpointChange modifier で、視点の切り替えに表示を追従
    • 例:視点を遮る壁を非表示にする
  • Presentations(popover, menu, sheet など)が Volume, RealityView, RealityKit でも利用可能に
    • presentationBreakthroughEffect で 3D コンテンツとの重なり方を制御
  • Clipping Margins API の追加
    • preferredWindowClippingMargins で、シーン境界外にビジュアル表現を拡張できる
    • 視覚のみでインタラクティブではない
    • windowClippingMargins environment で、システムによって許可されたマージンを取得

15:58 – Immersive space

  • Immersive Space で world recentering イベントや immersion style のカスタマイズが可能に
  • .onWorldRecenter でリセンタリングを検知(位置の再計算)
  • Progressive immersion style でのポータルのアスペクト比や範囲を調整可能に
    • .landscape, に加え .portrait
    • .portrait は iOS ゲームや多くの動きが含まれる体験に有効
  • Mixed immersion style で周囲環境に溶け込む
    • システム環境(e.g. 月)との共存も実現 .immersiveEnvironmentBehavior(.coexist)
  • Remote immersive space で macOS から Vision Pro へ Metal レンダリングを転送し、即時プレビューが可能
    • CompositorContentCompositorLayer に SwiftUI の環境変数やモディファイアを適用可能

22:16 – Scene bridging

  • UIKit アプリでもシーンブリッジングにより SwiftUI の Volume, Immersive Space を統合可能
    • Safari なども Spatial Browsing でこの仕組みを活用
  • UIHostingSceneDelegate を使い SwiftUI シーンを UIKit/macOS アプリに追加できる
  • configurationForConnectiong でホスティングデリゲートクラスを設定し外部イベントにも対応可能

WWDC25:Better together: SwiftUI and RealityKit

SwiftUI と RealityKit の相互連携に関するアップデート。盛りだくさんすぎた。オブジェクト操作を細かくハンドリングできるのは良い。ポップオーバー表示など自前でやっていたことも実装が楽になりそう。update クロージャーについては、無限ループの危険性を含めてかなり尺を使って解説しており、使いこなすのは難しそう。

CESや「モデル」の意味違いなど、アップデート以外の基礎的なテーマも網羅していて、情報量の多さをフォローする優しさを感じた。


0:00 – Introduction

  • SwiftUI と RealityKit の連携強化について紹介
  • 3D モデルと UI を組み合わせた新しい体験を実現

1:24 – Model3D enhancements

  • visionOS 26 で強化された二つの機能
    • Model3D にアニメーション再生
      • Model3D は SwiftUI ビューとして SwiftUIレイアウトシステムに従う
      • Model3DAsset でアニメーションリソースを読み込み、AnimationPlaybackController で制御(再生・停止・シーク)が可能
        • AnimationPlaybackControllerObservable に(例:time の変更監視)
    • ConfigurationCatalog からの読み込み
      • ConfigurationCatalogModel3D を初期化し、複数の外観やボディタイプを切り替えられる(@State で参照)

6:13 – RealityView transition

  • ParticleEmitter などのコンポーネント追加には Model3D が対応していないので RealityView への切り替えが必要
    • Model3D が intrinsic size に基づいてレイアウトされるのに対し、SwiftUI の与えたられたスペースを RealityView がすべて占有し、レイアウト崩れが発生
    • realityViewLayoutBehavior 修飾子:.fixedSize, .flexible, .centered で制御
      • make クロージャ実装後 1度だけ評価される
      • RealityView の原点を再配置するだけ
  • RealityKit の Entity に直接アニメーションやエフェクトを追加可能
    • ParticleEmitter で作成したエフェクトをコンポーネントに適用可能
    • RealityKit がプリセット値を提供し、Reality Composer Pro で調整可能
    • entity-component system
  • RealityView / Model3D の使い分け観点

11:52 – Object manipulation

  • visionOS 26 で Object Manipulation API が追加され、SwiftUI, RealityKit 双方で 3D オブジェクトの移動 回転 拡大縮小が可能
    • SwiftUI では manipulable モディファイア
      • orientation でサポートする操作
      • intertia で慣性(重さ)設定
    • RealityView では ManipulationComponent
      • メモ:hoverEffect.spotolight 指定
      • ManipurationEvents で ユーザー操作の開始終了、ハンドオフ(e.g. 右→左)などに応じた応答を実装可能(サウンド再生)
      • カスタムサウンド再生は、manipulationComponent.audioConfiguration = .none で無効化し、イベントサブクライブ内部で自前実装

15:35 – SwiftUI components

  • SwiftUI を RealityKit エンティティに統合するための3つのコンポーネント
    • ViewAttachmentComponent:SwiftUIビューをエンティティに直接追加
    • GestureComponent:エンティティに通常の SwiftUI ジェスチャをアタッチ、ジェスチャー値はエンティティの座標空間で報告
      • ジェスチャー対象のエンティティに、InputTargetComponent, CollisionComponent 両方を追加
    • PresentationComponent:RealityKit シーン内から SwiftUI ビューを popover のように表示

19:08 – Information flow

  • visionOS 26 で EntityObservable になり、SwiftUI との双方向データ連携が可能
  • Entity の位置、拡大縮小、回転など状態変化を SwiftUI View で監視し、UI に反映できる(withObservationTracking ブロック or SwiftUI 組み込みの監視)
  • SwiftUI と RealityKit の双方向連携
    • 従来:SwiftUI → update クロージャ → RealityKit
    • 逆方向も可能:RealityKit → Observable → SwiftUI
    • update クロージャの無限ループ回避策や、状態管理のベストプラクティス:
      • update クロージャで 監視対象のステートを更新しないこと
      • 更新する必要がある場合は、同値チェックを挟むこと
      • システムの更新関数(SwiftUIビュー本体評価外)から更新すること:e.g. gesture クロージャ
      • などなど
      • そもそも update クロージャを使わなければ避けられる

24:56 – Unified coordinate conversion

  • 新しい CoordinateSpace3D プロトコルで SwiftUI, RealityKit 間の座標変換が容易に(抽象座標空間)
  • GeometryProxy3D, Entity, Scene などが CoordinateSpace3D に準拠し、異なる空間間での距離計算や位置変換が可能
  • これにより 3D UI と 3D オブジェクトの連携がより直感的に

27:01 – Animation

  • SwiftUI のアニメーション API で RealityKit のコンポーネント(Transform, Audio, Model, Light など)を暗黙的にアニメーション可能
  • realityViewContent.animate()Entity.animate() で状態変化に応じたアニメーションを実装
  • Object Manipulation API と組み合わせてカスタムリリース挙動やバウンス効果も実現
    • 例:manipulation.releaseBehavior = .stay で無効化し、ManipulationEvents のイベント捕捉でアニメーションを自前実装

WWDC25:Explore spatial accessory input on visionOS

visionOS 26 におけるスタイラスやゲームコントローラへの対応について。コントローラには興味なかったが、近い将来 Apple Pencil が 6DoF 対応し、Vision Pro でも利用可能になる伏線と見てチェックした。

実は、XRコンテンツにおけるコントローラ/ハンドトラッキングの是非については過去にも(当時)Oculus Quest での体験をもとに考察したことがあった。

Oculus: ハンドトラッキングに感じる課題

パススルーしない没入型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 が実行中で設定されている場合、RealityKit AnchorEntity から ARKit AccessoryAnchor を取得可能
    • AnchorEntityARKitAnchorComponent にアクセスし、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」: 空間アクセサリトラッキング付きゲームコントローラーが必須

WWDC25:Design widgets for visionOS

visionOS 26 のアップデートのうち、まず試したのがウィジェットだった。紙やガラスといった素材感や光沢感をデジタルに落とし込むことで、実空間に存在する家具と共存するように設計されている。一貫して仮想コンテンツと一線を画するコンセプトだったのが印象的だった。近接認識なる機能によって、ユーザーとの距離に応じたコンテンツのだし分けができるとは知らなかった。


0:00 – イントロダクション

  • visionOSにおけるウィジェットは、ユーザーの現実空間に設置できる3Dオブジェクト
  • 既存のiPadアプリのウィジェットは、互換モードを有効にするだけでvisionOSに持ち込むことができ、自動的に空間的な見た目に変換される
  • ネイティブで構築することで、visionOS専用のサイズや、より空間に統合された見た目を実現できる
  • デザインの核となる4つの原則は「永続性」「固定サイズ」「カスタマイズ性」「近接認識」

3:36 – 表示の永続化

  • 一度空間に配置されたウィジェットは、セッションをまたいでも、部屋を移動しても、デバイスを再起動してもその場に固定され続ける
  • ウィジェットはホームグリッドの「ウィジェット」アプリから探し、空間に追加する
  • 机のような水平面、または壁のような垂直面に配置することで、その場に固定される
    • 水平面上に配置した時は、わずかにユーザー側に傾き、平面に影を落とす
  • ウィジェットは常にフレーム(枠)内に表示される:デジタルコンテンツと周囲環境とを繋ぐ役割
    • 新しいウィジェットを考える際は、それが部屋の一部であること(コンテクスト:キッチン、リビング、オフィス、、)を意識する
      • 例: 天気ウィジェット:実際の窓のような錯覚を生み出す
  • 同じウィジェットの複数のインスタンスを一つの空間に配置することも可能
  • ウィジェットは現実世界に存在するように振る舞う
    • 常に仮想コンテンツの背後にレンダリングされる
    • 常に物理環境の平面にスナップされる

6:39 – 固定サイズ

  • ウィジェットは現実世界の寸法に対応した、一貫性のあるサイズを持つ
  • テンプレートサイズ(小、中、大、特大)は物理的な大きさにマッピングされるため、設置される文脈(机の上、壁など)を考慮して選択することが重要
    • 生産性向上ツールでデスクの上に置くなら、小さなテンプレサイズ
    • 壁掛けのアートワークなら特大のテンプレサイズ
  • 現実のオブジェクトと空間を共有するため、印刷物や案内表示の原則を意識したデザインが必要
    • 明確な階層構造、明瞭なタイポグラフィ、慎重なスケール調整
  • ユーザーはウィジェットのサイズを75%から125%の範囲で調整できる
    • 加えて間近で見ることもできるため高解像度のアセットを使用することが推奨

8:57 – カスタマイズ性

  • スタイル:
    • Paper: 周囲の光に反応し、印刷物のように空間に溶け込むスタイル
      • Coating layer
      • Content layer: 空間に溶け込ませるための反射コーティング
    • Glass: 前景と背景に視覚的な分離を生み出し、前景の情報を常に鮮明に保つ軽量なスタイル、情報量の多いウィジェットに適している
      • Background
      • Duplicate UI layer: UIを暗めにした影により微妙な奥行きを加える
      • UI layer
      • Coating layer: 柔らかい反射仕上げ、部屋の照明に適応
  • :
    • システムが提供する豊富なカラーパレット(ライト7種、ダーク7種)をユーザーが選択し、ウィジェットを着色できる
  • マウンティングスタイル:
    • Elevated: 壁掛けの額縁のように表面に配置される
      • 水平・垂直両面に対応し、デフォルト設定
    • Recessed: 壁に埋め込まれたような見た目で、窓のような奥行き感を出す
      • 垂直面でのみ利用可能
      • 無効化が可能
  • フレーム幅:
    • 細いものから太いものまで5段階の幅をユーザーが選択できる(Recessed スタイルでは不可)
  • カスタム設定:
    • 標準のカスタマイズUIに加え、アプリ固有の設定(e.g. Musicのアルバムアートに合わせたテーマ or 時刻による自動調整)を追加できる

17:14 – 近接認識

  • ユーザーとの距離に応じて、ウィジェットが表示する情報を動的に調整する。
  • 2つの状態:
    • Default(近距離): 詳細な情報を表示 90m まで
    • Simplified(遠距離): 一目でわかるよう、必要不可欠な情報のみを表示
  • 距離に応じてボタンを追加するなど、距離に応じたインタラクション領域の変更が可能
    • インタラクションが含まれていなければ、ウィジェットタップでアプリ起動

WWDC25:Share visionOS experiences with nearby people

visionOS 関連のアップデート。visionOS 26 にアップデートしてから、ウィンドウにボタンが増えたので何かと思ったらこれのことか。今のところ身近に共有できる相手(Vision Pro ホルダー)がいないし、共有したいコンテンツも思いつかないのだが、、コンテンツのシェアリングは今のスマホやノートだと、物理的に身を寄せ合う必要があって限界があるため、今後グラス型のようにカジュアルユースなデバイスが登場するとしたら、体験共有のシームレスさが大きな売りのひとつになるかもしれない。


0:56 – 近くの人との体験共有の詳細

  • 各ウインドウのバーに新設された「共有」ボタンから、近くの人を選んで簡単に共有開始。
    • 共有されたウインドウは、全員の空間で同じ位置・サイズで表示され、ウインドウバーが緑色に変化。
    • まるで部屋にあるかのように指し示したりインタラクトすることが可能
    • 誰でもウインドウの移動・リサイズが可能で、全員の表示が同期。
    • デジタルクラウンで再センタリングも可能。手がウインドウに重なると内容がフェードし、人物が見やすくなる。
  • FaceTime との連携で、リモート参加者も空間に「ペルソナ」として登場し、近くの人と自然に混在可能。
    • ペルソナの表示位置は、共有するウィンドウのタイプ(e.g. volumetric)による
    • iOS/macOS など他プラットフォームからの参加者は、ウインドウ横にビデオ表示。
  • デフォルトでは「閲覧のみ」共有(他の人がアプリを持っていなくてもOK)。
  • インタラクティブな体験には SharePlay を採用。
    • visionOS の既存 SharePlay アプリは追加対応不要で近くの人と共有可能。
    • SharePlay の新APIで、近くの人向け体験を強化可能。

5:35 – 共有メニューからの共有の許可

  • 新しい Share メニューで GroupActivity を公開することで、ユーザーが簡単に共有を開始可能。
  • Volumetric ウインドウでは、アクティビティを公開していれば Share メニューが使える
    • 実装例の紹介
  • ImmersiveSpace ではウインドウバーがないため、アプリ内ボタンで共有開始を促す設計が必要。
  • 共有開始時に GroupSession を取得し、SharePlay を開始。
  • supportsGroupImmersiveSpacetrue に設定し、全員の空間を同期。

9:15 – 近くにいる参加者の体験の向上

  • 新APIで「近くの参加者」と「リモート参加者」を判別可能。
    • GroupSessionParticipantStateから .isNearbyWithLocalParticipant .localParticipant で判別  
    • 物理的に近い人同士を同じチームに割り当てるなど、空間に応じた体験設計が可能。

10:37 – ユーザーの相対位置へのコンテンツの配置

  • 参加者の空間内の位置(ParticipantState.pose)を取得し、各ユーザーの近くにコンテンツを配置するよう実装可能。
  • pose はリアルタイム追跡ではなく、共有開始や再センタリング時に更新。
  • seat pose(固定座席位置)も取得可能で、空間テンプレートのカスタマイズも可能。

13:20 – 共有されたメディア再生の調整

  • visionOS 26の AVPlayer/AVPlaybackCoordinator で、近くの人同士のメディア再生を完全同期するよう設計
    • 物理的に近いと、参加者のデバイスからの音ズレが顕著なため
  • GroupSession と連携し、音声・映像の遅延やエコーを防止。

15:38 – 複数のウインドウのサポート

  • 新APIで、複数 WindowGroup のうちどれをSharePlay対象にするかを明示的に指定可能。
  • .groupActivityAssociation 修飾子で、共有対象ウインドウを切り替え可能。

16:50 – アンカーされたコンテンツの共有

  • ARKitの新APIで、物理空間に固定した WorldAnchor を近くの参加者と共有可能。
    • ImmersiveSpaceは空間全体が動くため、物理的な位置固定に必要
    • WorldTrackingProvider を使用した実装方法の紹介
  • sharedWithNearbyParticipantstrue にしてアンカーを作成し、全員のデバイスで同じIDで同期。
    • worldAnchorSharingAvailability
    • これにより、家具配置アプリやコラボ体験など、物理空間を活かした共有体験が実現。
  • SharePlay 外でも独自のネットワークレイヤでも共有可能(ビジネス用アプリ)

WWDC25:Design hover interactions for visionOS

visionOS に関連するセッションビデオから。カスタムでホバーエフェクトが実装できるようになったとは、登場当初から期待していたが、いざ対応されると驚きだった。これまでは形状しかカスタマイズできなかった。ウェブアプリと同様にホバー表現が多様化するだろう、視線操作においてどんなインタラクションが有効であるかは良い題材になりそうだ。


0:33 – 基本知識

  • 重要なコンテンツは正面に配置し、インタラクティブ要素は丸みのある形状(円、ピル、角丸長方形)を推奨
  • 正確な操作のため、各要素は最低60ポイントのスペースを確保
  • 3Dオブジェクトも同様に、60ポイントは1m先で約4.4cmに相当
  • すべてのインタラクティブ要素にハイライト効果を適用し、カスタムコンポーネントや3Dオブジェクトにも同様の効果を追加

1:57 – カスタムエフェクト

  • 標準のハイライト効果に加え、独自のアニメーション(カスタムホバーエフェクト)を作成可能
    • standard appearance
    • hovered appearance
  • カスタムエフェクトは、アクション実行には使えない
    • 例: ダウンロードボタンを見つめただけではダウンロードは実行できない
  • アニメーションは3タイプ、用途により使い分け
    • 即時 instant: 見たら即時アニメーション
      • ボタンの先にさらに選択肢があることを示すインジケータの表示
      • 動画シークバーに残り時間のtooltipを表示
    • 遅延 delayed: 遅れて表示
      • ボタン下に表示されるタイトル tooltip
      • Safari profile button
    • 段階的 ramp: インスタントx遅延の段階展開
      • Environment icons: はじめ拡大だけ→しばらく後カプセル型に展開
  • ベストプラクティス:
    • アンカー要素を組み込む: e.g. タイトル
    • テキストの位置を固定
    • 隠れた要素は可視要素から表示か、見た即時に表示
    • 効果は控えめに
    • 予期しない動きを避ける
  • 実機でのテストと細かな調整が重要

9:37 – 注視してスクロール

  • 「Look to Scroll」機能で、視線だけでスクロールが可能に
  • スクロールビューの端を見つめると自動でスクロールが始まる
  • 主にリーディングやブラウジング用途のビューで有効化を推奨
  • UIコントロールが多いリストや、パララックスなど特殊なアニメーションを伴うビューには不向き
  • スクロールビューはウィンドウ全体を使い、明確な境界を設けると自然な体験になる

12:23 – 持続的なコントロール

  • 動画プレイヤーなどの自動非表示UIは、ユーザーが注視している間は表示を持続し、視線を外すと非表示に
  • 標準では手を加えずに適用されるが、カスタムコントロールの場合は、持続表示の挙動を自分で有効化する必要がある
  • メディアコントロールやセッションコントロールなど、遅延非表示UI全般で推奨

WWDC25:What’s new in visionOS 26

visionOS のアップデート。SwiftUI と RealityKit との親和性が高まったことが嬉しい。ハンドトラッキングの即応性が高まったのも嬉しい。あとは、AI、Speech-to-Text、ビデオ周り、エンタープライズ向けのアップデート。

触れる機会はなさそうだが、Enterprise API でウィンドウがユーザー追従してくれそうなのが気になる。


0:00 – Introduction

  • visionOS 26のリリースにより、アプリを次のレベルに引き上げる多くの新機能が追加
  • 本セッションでは、ボリュメトリック機能、システム機能、ゲーム・アクセサリ、共有体験、没入型メディア、空間Web、エンタープライズAPIなど、幅広い新機能を紹介

1:34 – Volumetric features

  • SwiftUIに3Dレイアウトを強化する新機能が多数追加 (Spatiall layout)
    • depthAlignment でZ軸方向の整列が簡単に
    • rotation3DLayout でレイアウトを意識した回転が可能に
    • その他多くの従来のモディファイアが3Dにも対応
  • Volume内でAlert, Sheet, Menu, PopoverなどのUIプレゼンテーションが可能に
    • Volumes, Ornaments, Attachments から表示可能
  • dynamic bounds restrictions で、アプリの境界を越えてコンテンツをレンダリングし、現実世界とシームレスに融合
    • .preferredWindowClippingMargins modifier
  • 新しいObject Manipulation API や RealityKit の ManipulationComponent で、3Dオブジェクトの直感的な操作を実現
  • SwiftUI, RealityKit, ARKit間の連携が強化され
    • 座標変換やジェスチャーハンドリングが容易に ( SwiftUI view → ARKit accessor anchor でさえも可能)
    • RealityKit の Observable entity が、SwiftUI のアップデートとも連携可能に
    • ViewAttachmentComponent: UIをRealityView のコードに対してインラインに実装可能に
    • Model3D to RealityView
      • アニメーションの再生制御が可能
      • .realityViewSizingBehavior: 3D content内に対しどうサイズ調整するか

10:28 – System features

  • Apple Intelligence 機能の利用
    • Foundation Models framework により、オンデバイスLLMへのアクセスが可能に
    • Image Playground が進化し、ChatGPT 連携や新しいスタイルを追加
  • 新しいSpeech-to-text API SpeechAnalyzer と新モデル SpeechTranscriber が登場。高速・高精度な文字起こしをオンデバイスで実現。
  • ウィンドウやシーン、Quick Look コンテンツが再起動後も同じ場所に復元されるように
    • SwiftUI の復元APIにより、どのシーンに対し復元を許容するか指定可能に
      • .defaultLaunchBehavior(.supressed)
      • .restorationBehavior(.disabled)
  • WidgetKitもvisionOSに最適化され、ガラスや紙のような質感調整や、ユーザーとの距離に応じた表示切替が可能に
    • levelOfDetail widgetTexture supportedMountingStyles

15:21 – Games and spatial accessories

  • ハンドトラッキングが最大3倍高速化(90Hz)し、ゲームの応答性が向上
  • 新しい空間アクセサリ (spatial accessories) に対応
    • Sony PlayStation VR2 Sense controller: 6DoFトラッキング可能なゲームコントローラ
    • Logitech Muse: 精密な描画や彫刻に適したクリエイティブツール
    • Shared space / Full space で有効
    • RealityKit / ARKit でトラック
  • ハイエンドiPadゲームの Vision Pro 対応
    • App Store Connect 経由で、既存のハイエンドiPadゲームをvisionOSに簡単に移植可能に
    • Progressive Immersion Styleが拡張され、既存のiOS/iPadOSゲームをvisionOSに最適化しやすく
  • Compositor Services
    • ホバーエフェクト: Metal immersive apps にも対応
    • 動的なレンダー品質 (Dynamic render quality) 調整に対応
  • macOS spatial rendering: Macのレンダリング能力を使って、高品質なイマーシブコンテンツをVision Proにストリーミング可能に
  • TabletopKit が進化し、カスタムデータやカスタムアクションを簡単に追加・同期できるようになり、共有ゲームの開発が容易に

23:00 – Shared experiences

  • SharePlayと 空間ペルソナ(Spatial Personas)により、遠く離れた人とも同じ空間でコンテンツを共有する魔法のような体験が実現
  • Nearby Window Sharing により、相手の実際の位置や動きを仮想空間上に再現し、より自然な共同作業や会話を可能にする

25:03 – Immersive media ecosystem

  • RealityKit の ImagePresentatinoComponent により、3D spatial content の生成が容易に
  • Apple Immersive Video(AIV)をサードパーティアプリに直接埋め込み可能に
  • 180度、360度、WideFov フォーマットへも対応
  • Apple Projected Media Profile(APMP)

31:04 – Spatial web

  • Spatial Browsing: Safari のナビゲーションバーからボタンを押すだけで体験可能
  • visionOSのSafariで、WebXRとmodel要素によるイマーシブなWeb体験をサポート
  • Webサイト上で3Dモデルを表示したり、VR/ARコンテンツを体験したりすることが可能に
  • Web Backdrop: 開発者用の新しいプレビューツール
    • ビジターにカスタム immersive environments を提供する際に使用
  • Look to Scroll: .scrollInputBehavior(.enabled, for: .look)

34:13 – New enterprise APIs

  • メインカメラのアクセスを shared space に活かすことができ、他の spatial app と同時にカメラ利用を伴う体験が提供可能
  • Stereoscopic Main Session: 左右のメインカメラ個別/同時にアクセス可能
  • ARKit の CameraRegionProvider : スタビライズされたビデオフィードにアクセス可能
  • 新しいAPI Protected Content: .contentCaptureProtected(bool) を指定することで、特定のビューをキャプチャーから保護することができる
  • Window Follow Mode: ユーザーの位置にウィンドウが自動的に追従する
  • Nearby Window Sharing for Enterprise
    • SharedCoordinateSpaceProvider