ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ARKitを活用したより高度な空間コンピューティング体験の創出
ARKitの最新機能を使用して、魅力的なイマーシブ体験を作成する方法をご紹介します。部屋のトラッキングとオブジェクトトラッキングを使用し、周囲とよりスムーズに連携させる方法をご確認いただけます。このプラットフォームで利用できる、周囲の照明の変化に応じてアプリを調整する機能もご紹介します。強化されたハンドトラッキングと平面検出機能もご紹介します。これらの機能を使用すると、より直感的な空間体験を実現できます。
関連する章
- 0:00 - Introduction
- 2:30 - Room tracking
- 5:46 - Plane detection
- 6:46 - Object tracking
- 9:34 - World tracking
- 11:38 - Hand tracking
リソース
関連ビデオ
WWDC24
WWDC23
-
ダウンロード
こんにちは Divyeshです このセッションでは visionOSのARKitに 新たに追加される新機能をご紹介します 昨年 Appleは OS全体にわたって コアなリアルタイムアルゴリズムをホストする ARKitを導入しました 皆さんがARKitのトラッキング機能や シーン認識機能を使用して 驚異的な空間体験を構築していることに 感銘を受けています 例えばBlackboxは ARKitを活用して パズルを解くのに必要な 手のジェスチャを検出します またSuper Fruit Ninjaでは ハンドトラッキングを使って果物をスライスし シーン認識機能を使用して 床に飛び散る 果物のしぶきをリアルに表現しています 私達は皆さんの意見をもとに 周囲の環境をさらに理解し 処理できるアプリを開発できるよう この1年でいくつかの新機能を開発しました では その新機能をいくつかご紹介します まず シーン認識の機能がさらに向上しました 新しいルームトラッキング機能もあります アップデートされた平面検出機能では 今いる部屋をベースに 体験をカスタマイズできます 新しいオブジェクトトラッキング機能も ご紹介します この機能では現実世界のオブジェクトを インタラクティブに視覚化できます その後 ARKitのワールドトラッキングが より多様な照明条件に 対応可能になったことを説明します そして最後に ハンドトラッキングの最新機能が アプリにもたらすメリットについて 説明します まず visionOSにおけるARKitについて 簡単に確認しておきましょう フルスペースで表示されている visionOSアプリは ARKitからアンカーの形式で データを受け取ることができます
アンカーは3次元空間における 位置と向きを表します 例えば 平面検出データは PlaneAnchorの形式で提供されます このアンカーには現実世界で検出された 平面の情報が保持されます
ARKitはデータプロバイダを通じて アプリにアンカーを渡します データプロバイダは ARKitの 個々の機能を設定し そのデータを 受け取るためのインターフェイスです PlaneDetectionProviderはPlaneAnchorを 受け取るためのインターフェイスです
ARKitSessionを実行するには そのアプリで一緒に使用する 一連のデータプロバイダを指定します ARKitのAPIを初めて使う方や もっと詳しく知りたい方は 昨年のセッション「Meet ARKit for spatial computing」をご覧ください では1つ目の新機能 ルームトラッキングをご紹介します visionOSのアプリの多くは ユーザーがいる室内に設定されます メッシュと平面のアンカーデータを使えば 仮想コンテンツをリアルに配置して 場面を補強できます ではこれを さらに一段高いレベルへと 進めてみましょう 寝室に入ると 仮想のペットが 迎えてくれることを想像してみてください ルームトラッキングを使えば そのようなユニークな体験を 訪れる空間に合わせて調整できます
周囲を見渡すと ARKitによって今いる部屋の境界が 識別されます この情報を使用して 検出された壁や床の 正確なジオメトリが計算されます さらにARKitでは 部屋から部屋への移動も認識されます 新しいエリアに入ると 今度は今いる スペースのデータが表示されるようになります このためアプリでは 今いる部屋に応じた 体験を提示できます
これらすべての情報は ワールドセンシングの 許可が必要な 新しいルームトラッキングの データプロバイダを通じて表示されます
RoomTrackingProviderはユーザーが訪問した 部屋についての情報を提供します 現在 閉じた空間にいるとARKitが判断すると 現在の部屋のアンカーに アクセスできるようになります 現在の部屋のアンカーを使用して そのインテリアのレイアウトに沿った 体験を作り出すことができます
アプリで非同期のルームトラッキングの 更新をリッスンすることもできます これは他のデータプロバイダから アンカーを受信する方法と同じです この方法は 特に部屋から部屋へと移動する際 現在いる空間の最新情報を 受け取るときに役立ちます
なお RoomTrackingProviderで 更新されるのは 現在いる部屋のアンカーデータのみです では実際に見てみましょう 各RoomAnchorは 特定の閉じた空間に 関する情報を保持しています
このアンカーは現在の部屋を モデル化するかどうかを示します これは特定のコンテンツを 自分が今いる空間だけに 表示する場合に便利です
各RoomAnchorは周囲の壁や床の 配置情報も保持しています この情報は部屋の形状を定義する 頂点と辺 そして三角形の 面の集まりで構成されます このメッシュは メッシュアンカーや 平面アンカーに見られる ジオメトリと比べて より部屋の境界に沿っています
完全な壁や床ごとに1つずつ 独立したジオメトリの配列として メッシュを取得することもできます これらは部屋の外に配置された 仮想コンテンツを隠す場合や 壁全体を背景に仮想ポータルを開くなどの 拡張現実体験で役立ちます また 特定の3次元点が 部屋の境界内に存在するかどうかを テストすることもできます ワールドトラッキングと組み合わせれば ある部屋に入ると バーチャルオブジェクトが動き出すという 魔法のような体験を実現できます
最後に この新しいアンカーには 部屋に関連する 平面とメッシュのアンカーIDが含まれます これらを他のシーン認識機能と組み合わせれば アプリを最適化するのに役立ちます 例えば 現在の部屋の外にある 平面やメッシュについては 負荷の高い演算を避けることができます アプリでルームトラッキングを 活用する方法は他にも沢山あります ぜひいろいろ試してみてください 次に 新しくなった平面検出機能について 説明します ARKitは周囲の平坦な面を検出すると それに関する情報をPlaneAnchorの形式で 提示することができます これは机の上にボードゲームを置いたり 壁に仮想ポスターを貼ったりなど 様々な面に仮想コンテンツを 配置するのに便利です PlaneDetectionProviderは 水平面や垂直面が検出された際に
アプリに通知することができます
さらに今年は新しい傾斜面(Slanted) のアラインメントが導入され 斜面も検出できるようになりました
アプリは変更なしで 引き続き水平方向と 垂直方向に配置された 平面アンカーを受信します 傾斜面アンカーも取得したい場合は 1つの変更だけで簡単に 取得できるようになっています 必要なのは PlaneDetectionProviderに設定する アラインメントの更新だけです
単に新しい傾斜アラインメントを追加します 簡単ですよね
次は オブジェクトトラッキングです これはvisionOSの新機能です ARKitで 環境内に静的に配置された 現実世界のオブジェクトを トラッキングできるようになりました オブジェクトトラッキングを使用すると 各アイテムの位置と向きを取得して それらに仮想コンテンツを固定できます 例えば 教育アプリでは ユーザーが特定の楽器を見ている時に 3D視覚エフェクトを表示することができます ARKitでこれらのアイテムをトラッキングするには 一連のReferenceObjectを 指定する必要があります 参照オブジェクトは現実世界にある既知の オブジェクトの空間的特徴をエンコードします ReferenceObjectを作成するには まずトラッキングするアイテムの3Dモデルを USDZ形式で用意します
次に CreateMLの新しい 空間オブジェクトトラッキング機能を使用して アセットからReferenceObjectを生成します
最後に 生成したReferenceObjectを使って ARKitでトラッキングを行います
ReferenceObjectの作成方法の詳細は 今年のセッション「Explore object tracking for visionOS」をご覧ください
今回は ReferenceObjectを作成した後に ARKitで物理的なアイテムをトラッキングする 最後のステップに焦点を当てます
新しいAPIを使えばいかに簡単か 見てみましょう
ReferenceObjectは実行時に ファイルURLまたはバンドルから ロードできます
ここでは地球のReferenceObjectを URLでロードします
参照オブジェクトが正常にロードされたら それを使用して新しい ObjectTrackingProviderを設定します
次に 新しいObjectTrackingProviderを ARKitSessionで実行します
データプロバイダが実行状態になったら 受信されたトラッキング結果の処理を開始できます
トラッキング結果は ObjectAnchorの形で提示され それぞれがトラッキングされた 1つのアイテムを表します
ObjectAnchorには 検出したオブジェクトの AxisAlignedBoundingBoxが保持されます このバウンディングボックスの中心と範囲 そして最小と最大の3D座標点を取得できます
このアンカーには対応する ReferenceObjectも保持されます 元のUSDZファイルのパスが ReferenceObjectに含まれていれば ここからアクセスできます
ObjectAnchorのアップデートも 他のデータプロバイダの場合と同様に リッスンできます 最新のトラッキングのアップデートを使えば 素晴らしい仮想コンテンツで オブジェクトを補完できます 例えば 地球にリアルな影を落とす 衛星を追加したり 地球のコアを覗き込んだりすることもできます
サンプルのアプリも公開していますので ダウンロードしてデバイスで 試すことができます ぜひ後でチェックして詳細をご確認ください では このプラットフォームの基盤である ワールドトラッキングの改良点を いくつかご紹介します ARKitは様々なカメラとセンサーを使って ワールドトラッキングのような 高度なアルゴリズムを実行します ユーザーがいる物理的位置の照明が 不十分な場合 センサーのデータに影響し アルゴリズムがシームレスに 動作しなくなる可能性があります 例えば 明かりのない暗い部屋では ワールドトラッキングの質が 低下する可能性があります
今年は このような照明の変化に対応する メカニズムが追加されました 照明が不十分などの物理的要因によって トラッキングが制限されていることが 検出されると その後は向きの変化だけがトラッキングされ 空間内の位置はトラッキングされなくなります
皆さんのアプリは この向きベースの トラッキングをシステムレベルで 利用することができます 難しい環境に置かれた場合でも 照明が原因でトラッキングが 完全に失われる心配がありません
このような状況に十分に備えておきたい場合は トラッキング中のこうした変更を 通知するAPIも提供していますので 状況に応じて体験を調整することができます アンカーの位置は更新せずに 配置したコンテンツを きれいに並べ替えたい場合もあります アプリが完全にワールドトラッキングに 依存している場合は もっと明るい場所に移動して再開するよう ユーザーに指示する必要があります
SwiftUIを使用している場合 新しい「worldTrackingLimitations」 環境値によってこれを指示できます 例えば 位置をトラッキングできないときは この値の変更をリッスンして コンテンツを並べ替えることができます
ARKitでは DeviceAnchorが拡張されて 「.trackingState」プロパティが 追加されました このプロパティはトラッキングが 完全に機能しているか または向きベースのトラッキングのみに 制限されているかを示します 向きベースのトラッキングに切り替わると 既存のワールドアンカーが 「not tracked」とマークされる場合があります ワールドトラッキングが復旧すると 持続アンカーのトラッキングステータスは 元に戻ります
最後に このプラットフォームでの 主な入力手段である ハンドトラッキングの進化について説明します visionOSの導入により ユーザーの手や指をトラッキングする機能が 追加されました アプリではこの情報を使って ジェスチャを検出し 仮想コンテンツをユーザーの 手の位置に固定できます
昨年 Appleは この情報を HandAnchorの形式で取得するための 2つの方法を確立しました 1つは HandTrackingProviderを ポーリングして 最新のアップデートを確認する方法 もう1つは HandAnchorが利用可能に なった時点で非同期で受け取る方法です 幸いなことに HandTrackingProviderは 今後このデータを表示レートで 提示するようになります 非同期のHandAnchorの更新には 多少の遅延がありますが 表示に合わせたより高い頻度で提供されるため 動作がよりスムーズになります この効果は 特にApple Vision Proの 装着時に感じることができます 最小限の遅延でハンドトラッキングの 結果を得たい場合 ARKitでは 近い将来のある時点における HandAnchorの位置を 予測できるようになりました Compositor ServicesとRealityKitの どちらを使ってレンダリングする場合も 新しいハンド予測APIを活用すれば トラッキング結果をすばやく取得できます
では例を見てみましょう Compositionor Servicesを使用する場合は visionOSに新たに導入された 「trackableAnchorTime」を ターゲットにします このタイムスタンプでHandAnchorを 予測することで 最適なコンテンツ登録が可能になります
そのタイムスタンプを秒に変換して ARKitに渡せば 高度な前方予測を行うことができます このアプリでは Compositor Servicesを使って 仮想ティーポットをレンダリングしています 予測されたHandAnchorを使用することで アンカーされたティーポットは手を動かしても 手に固定されたままになります これは低レイテンシの予測なので 精度が多少犠牲になる場合があることに 注意してください Compositor Servicesを使った レンダリングの詳細については 今年のセッション 「Render Metal with passthrough in visionOS」をご覧ください また昨年のセッション 「Meet ARKit for spatial computing」で 示した例も参考になるでしょう
ハンドトラッキングのこれらの強化機能は 様々なユースケースにメリットをもたらします 表示に合わせたHandAnchorの更新は 遅延がそれほど問題にならない場合の ジェスチャ検出やスムーズな ストローク描画に適しています ハンド予測は 滑らかさは それほど重要ではなく コンテンツをできるだけ 手に固定しておきたい場合に役立ちます
これらの進化機能はRealityKitの側でも 手のAnchorEntityに反映されました
RealityKitを使って 手の近くにコンテンツを固定する場合 必要に応じて「continuous」または 「predicted」のハンドトラッキングを 選択できます
詳しい例は 新しいセッション 「Build a spatial drawing app with RealityKit」をご覧ください 以上が今年のARKitの新機能です このセッションでは 空間コンピューティング体験の 強化に役立つ最新機能について 説明しました
また デベロッパの創造性をさらに高める 新しいルームトラッキングと オブジェクトトラッキングの機能も 紹介しました 新しいvisionOSの活用に役立つ 素晴らしいセッションが多数用意されています チーム一同 皆さんが新しいARKitで 素晴らしいアプリやゲームを 生み出すのを楽しみにしています ご視聴ありがとうございました
-
-
3:35 - RoomTrackingProvider
// RoomTrackingProvider @available(visionOS, introduced: 2.0) public final class RoomTrackingProvider: DataProvider, Sendable { /// The room which a person is currently in, if any. public var currentRoomAnchor: RoomAnchor? { get } /// An async sequence of all anchor updates. public var anchorUpdates: AnchorUpdateSequence<RoomAnchor> { get } ... }
-
4:20 - RoomAnchor
@available(visionOS, introduced: 2.0) public struct RoomAnchor: Anchor, Sendable, Equatable { /// True if this is the room which a person is currently in. public var isCurrentRoom: Bool { get } /// Get the geometry of the mesh in the anchor's coordinate system. public var geometry: MeshAnchor.Geometry { get } /// Get disjoint mesh geometries of a given classification. public func geometries(of classification: MeshAnchor.MeshClassification) -> [MeshAnchor.Geometry] /// True if this room contains the given point. public func contains(_ point: SIMD3<Float>) -> Bool /// Get the IDs of the plane anchors associated with this room. public var planeAnchorIDs: [UUID] { get } /// Get the IDs of the mesh anchors associated with this room. public var meshAnchorIDs: [UUID] { get } }
-
8:06 - Load Object Tracking referenceobject
// Object tracking Task { do { let url = URL(fileURLWithPath: "/path/to/globe.referenceobject") let referenceObject = try await ReferenceObject(from: url) let objectTracking = ObjectTrackingProvider(referenceObjects: [referenceObject]) } catch { // Handle reference object loading error. } ... }
-
8:27 - Run ARKitSession with ObjectTracking provider
let session = ARKitSession() Task { do { try await session.run([objectTracking]) } catch { // Handle session run error. } for await event in session.events { switch event { case .dataProviderStateChanged(_, newState: let newState, _): if newState == .running { // Ready to start processing anchor updates. } ... } } }
-
8:43 - ObjectAnchor
// ObjectAnchor @available(visionOS, introduced: 2.0) public struct ObjectAnchor: TrackableAnchor, Sendable, Equatable { /// An axis-aligned bounding box. public struct AxisAlignedBoundingBox: Sendable, Equatable { ... } /// The bounding box of this anchor. public var boundingBox: AxisAlignedBoundingBox { get } /// The reference object which this anchor corresponds to. public var referenceObject: ReferenceObject { get } }
-
11:03 - World Tracking - reacting to changes in lighting conditions
struct WellPreparedView: View { @Environment(\.worldTrackingLimitations) var worldTrackingLimitations var body: some View { ... .onChange(of: worldTrackingLimitations) { if worldTrackingLimitations.contains(.translation) { // Rearrange content when anchored positions are unavailable. } } } }
-
12:51 - Hands prediction
// Hands prediction func submitFrame(_ frame: LayerRenderer.Frame) { ... guard let drawable = frame.queryDrawable() else { return } // Get the trackable anchor time to target. let trackableAnchorTime = drawable.frameTiming.trackableAnchorTime // Convert the timestamp into units of seconds. let anchorPredictionTime = LayerRenderer.Clock.Instant.epoch.duration(to: trackableAnchorTime).timeInterval // Predict hand anchors for the time that provides best content registration. let (leftHand, rightHand) = handTracking.handAnchors(at: anchorPredictionTime) ... }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。