WWDC Quick Look 💓 By SwiftGGTeam
What's new in RealityKit

What's new in RealityKit

元の動画を見る

ハイライト

RealityKit 2020 では、Videomaterial、Scene Understanding、DebugModelComponent が追加され、ARKit 4 の Face Tracking および Location Anchors に接続されており、AR コンテンツによるビデオ テクスチャの再生、LiDAR 再構築メッシュの感知、レンダリング プロパティのデバッグ、実際の地理的位置のバインドが可能になります。


主要内容

AR アプリケーションで最も難しいステップは、多くの場合、モデルを画面上に配置しないことです。本当の問題は、仮想オブジェクトが実際の部屋に置かれたときに、そこにあるように見えるかどうかです。木の幹でブロックされたり、段差で跳ね返ったり、地面に影を残したり、エラーがモデル、マテリアル、空間メッシュのいずれによるものであるかを開発者に知らせる必要があります。

RealityKit は 2019 年に AR 用の 3D エンジンを提供します。この 2020 セッションではランタイム機能に焦点を当てます。 Apple は、固体表面が AVPlayer で再生されるビデオを直接使用できるようにする新しいビデオ マテリアルを追加し、ビデオ サウンドを物理的な場所からの空間オーディオに自動的に変換します。

より大きな変化はシーンの理解によってもたらされます。 RealityKit は、LiDAR と ARKit によって生成された現実世界のメッシュを使用して、現実の環境を、オクルージョンしたり、影を受け取ったり、物理学に参加したり、レイで検出したりできるオブジェクトに変換します。開発者は、平面や単純なジオメトリで世界を近似することしかできなくなりました。

デバッグは RealityKit 自体にも行われます。新しい DebugModelComponent は、指定されたエンティティの法線、テクスチャ座標、マテリアル パラメータ、および PBR ライティング出力を表示できます。これにより、別の一般的な問題、つまりモデルが外部ツールから取得された場合、レンダリング エラーの原因がリソースの破損か間違ったコード設定であるかが解決されます。

最後に、RealityKit は ARKit 4 でフォローアップします。顔追跡は、TrueDepth カメラを搭載していないが、A12 以降のチップを搭載したデバイスにも拡張されています。ロケーション アンカーを使用すると、現実世界の座標を使用して AR アンカーを作成し、コンテンツを特定の場所に配置できます。


詳細

Videomaterial: 動画をマテリアルや空間音源に変える

(04:52) AVFoundation を使用したビデオマテリアルAVPlayerビデオソースとして。開発者が最初に作成するAVURLAssetそしてAVPlayerItem、 またAVPlayerRealityKitに引き渡されるVideoMaterial。マテリアルがエンティティに割り当てられると、ビデオ テクスチャがプレーヤーで更新されます。

// Use AVFoundation to load a video
let asset = AVURLAsset(url: Bundle.main.url(forResource: "glow", withExtension: "mp4")!)
let playerItem = AVPlayerItem(asset: asset)

// Create a Material and assign it to your model entity...
let player = AVPlayer()
bugEntity.materials = [VideoMaterial(player: player)]

// Tell the player to load and play
player.replaceCurrentItem(with: playerItem)
player.play()

キーポイント:

  • AVURLAssetアプリバンドルからのロードを担当しますglow.mp4
  • AVPlayerItemプレーヤーが消費できるアイテムにリソースをパッケージ化します。
  • VideoMaterial(player:)プレーヤーの出力を RealityKit マテリアル システムに接続します。
  • bugEntity.materialsビデオ素材を固体表面に置きます。
  • replaceCurrentItem(with:)現在何が再生されているかを確認します。
  • play()再生を開始すると、時間の経過とともにテクスチャが変化し始めます。

この API の価値は、AVFoundation を再利用することにあります。プレーヤーはまだ利用可能ですplaypauseseek、使用できますAVPlayerLooperループ再生も可能AVQueuePlayerプレイキュー。このセッションでは、ビデオ素材が空間オーディオを再生し、エンティティがビデオ サウンドの空間ソースになることも述べられています。

シーンの理解: オクルージョン、シャドウ、物理学、衝突を現実世界に取り入れます

(06:53) シーン理解はARView環境関連の設定。これには 4 つのオプションが含まれています。occlusionreceivesLightingphysicscollision

使用上の重要なポイント:

  • .occlusion現実のオブジェクトが仮想オブジェクトをブロックし、木がバグをブロックできるようにします。
  • .receivesLighting仮想オブジェクトによって投影される影を現実の表面に受けさせます。
  • .physics仮想オブジェクトを現実世界のメッシュと物理的に相互作用させます。
  • .collision衝突イベントを生成し、現実世界のレイキャストを可能にします。
  • セッションが明示的に指定されている、receivesLightingオクルージョンは自動的に有効になります。physics衝突は自動的に有効になります。

物理学を使用する場合、留意すべき制限が 4 つあります。現実世界の物体は静的であり、質量が無限であると考えられます。グリッドは継続的に更新されます。グリッドは、ユーザーがスキャンした領域のみをカバーします。物理メッシュは近似値であり、エッジはオクルージョン マスクほど正確ではありません。物理演算がオンになっている場合、共同セッションはサポートされません。

HasSceneUnderstanding を使用して現実世界のエンティティを検索する

(13:58) Raycast は仮想エンティティと現実世界のエンティティの両方を返します。 RealityKit は、現実世界のオブジェクトのシーン理解エンティティを作成し、それらを準拠させます。HasSceneUnderstanding。したがって、結果をフィルタリングするときにこの特性を探してください。

// Get the position and forward direction of the bug in world space
let bugOrigin = bug.position(relativeTo: nil)
let bugForward = bug.convert(direction: [0, 0, 1], relativeTo: nil)

// Perform a raycast
let collisionResults = arView.scene.raycast(origin: bugOrigin, direction: bugForward)

// Get all hits against a Scene Understanding Entity
let filteredResults = collisionResults.filter { $0.entity as? HasSceneUnderstanding }

// Pick the closest one and get the collision point
guard let closestCollisionPoint = filteredResults.first?.position else {
	return
}

if length(bugOrigin - closestCollisionPoint) < safeDistance {
  // Avoid obstacle too close to object’s forward
}

キーポイント:

  • position(relativeTo: nil)ワールド空間におけるバグの位置を取得します。
  • convert(direction:relativeTo:)ローカル方向をワールド空間に変換します。
  • arView.scene.raycastバグの進行方向に沿って衝突を検出します。
  • filter { $0.entity as? HasSceneUnderstanding }現実世界のオブジェクトのみを保持します。
  • filteredResults.first?.position最も近い現実世界のタッチポイントを取得します。
  • 未満の距離safeDistanceでは、木、壁、段差にぶつからないようにキャラクターを回転させることができます。

このコードは実際の使用法を示しています。AR キャラクターは実際のオブジェクトに基づいて移動できます。キャラクターはツリーのセマンティクスを知る必要はなく、RealityKit によって提供される現実世界のエンティティに対して光線検出を実行することだけが必要です。

衝突イベントを使用して現実世界の応答をトリガーする

(14:48) 衝突イベントは以下にも依存します。HasSceneUnderstanding。チェックインイベントコールバックentityAまたはentityBそれは現実世界の実体ですか?そうである場合、他のエンティティは、現実世界の衝突が発生する仮想オブジェクトです。

// Subscribe to all collision events
arView.scene.subscribe(to: CollisionEvents.Began.self) { event in
    // Get any entity if it conforms to HasSceneUnderstanding
    guard let sceneUnderstandingEntity = (event.entityA as? HasSceneUnderstanding)
                                      ?? (event.entityB as? HasSceneUnderstanding)
    else {
       // Did not collide with real world
       return
    }
    // The bug entity is the one that is not the scene understanding entity
    let bugEntity = (sceneUnderstandingEntity == event.entityA)
                   ? event.entityB : event.entityA

   // Disintegrate the bug entity

}

キーポイント:

  • subscribe(to: CollisionEvents.Began.self)衝突開始イベントをリッスンします。
  • event.entityAそしてevent.entityB衝突する 2 つのエンティティです。
  • as? HasSceneUnderstandingいずれかの当事者が現実世界を表しているかどうかを判断します。
  • guard失敗時に直接戻り、2 つの仮想エンティティ間で衝突が発生したことを示します。
  • 条件式は別のエンティティを取り出し、リソースを置き換えたり、アニメーションを再生したり、パーティクル エフェクトをトリガーしたりできます。

セッション内の例は、地面に衝突すると分解するバグです。実際のプロジェクトでは、ガラスが割れる、ボールが地面で跳ね返る、仮想キャラクターが実際の階段を踏むなどのインタラクションに同じモードを使用できます。

衝突グループを使用して、現実世界と衝突するかどうかを制御します

(16:00) 一部のエンティティは現実世界によって遮られるだけでよく、現実世界と衝突すべきではありません。 RealityKit は現実世界のオブジェクトに新しい機能を追加します.sceneUnderstanding衝突グループは衝突フィルタに追加または除外できます。

// Only collide with real world
entity.collision?.filter.mask = [.sceneUnderstanding]

// Never collide with real world
entity.collision?.filter.mask = CollisionGroup.all.subtracting(.sceneUnderstanding)

キーポイント:

  • .sceneUnderstandingRealityKit によって管理される現実世界のコリジョン グループを表します。
  • 最初の行では、エンティティを現実世界とのみ衝突させます。
  • 2 行目は、エンティティが LiDAR メッシュに衝突するのを防ぐために、すべての衝突グループから現実世界を削除します。
  • RealityKit はシーン理解エンティティの衝突グループを自動的に設定するため、開発者はこれらのエンティティを変更する必要はありません。

これは、Apple が現実世界のエンティティが読み取り専用であることを強調する理由も説明します。これらは RealityKit によって作成および管理され、コンポーネントを変更すると未定義の動作が発生する可能性があります。

DebugModelComponent: レンダリング パイプラインのプロパティを直接確認します。

(20:10) レンダリングの問題はリソースに隠れていることがよくあります。間違った法線方向、位置ずれしたテクスチャ座標、異常な粗さまたは金属パラメータにより、モデルが非現実的に見える場合があります。 RealityKit は、指定されたデバッグ プロパティでエンティティ表示をオーバーライドする新しいデバッグ モデル コンポーネントを追加します。

使用上の重要なポイント:

  • デバッグモデルコンポーネント 可視化の対象となるレンダリング属性を選択します。
  • セッションは、ビジュアル属性を 3 つのカテゴリに分類します: 頂点属性 (頂点属性)、マテリアル パラメーター (マテリアル パラメーター)、および PBR 出力 (物理ベースのレンダリング出力)。
  • 法線、テクスチャ座標、ベース カラー、粗さ、メタリック、受信した拡散ライティング、受信した鏡面ライティングは、音声で指定されたすべてのトラブルシューティング オブジェクトです。
  • session は、デバッグがターゲット エンティティにのみ影響し、子エンティティには自動的に継承されないことを示します。

USDZ にエンティティ構造の複数のレイヤーがある場合は、チェックするエンティティごとにこのコンポーネントを個別に追加する必要があります。これにより、問題の原因がモデルのインポート、マテリアル設定、またはシーンの照明のどれであるかをすぐに判断できます。

ARKit 4 の統合: 顔追跡と位置アンカー

(21:29) ARKit 4 は、TrueDepth カメラを搭載せず、A12 以降のチップを搭載したデバイスに顔追跡を拡張します。すでにコードまたは Reality Composer でフェイス アンカーを使用している RealityKit ユーザーは、コードを変更することなく、より多くのデバイスでアプリを動作させることができます。

(21:57) 位置アンカー 現実世界の座標を使用してアンカーを作成します。なぜならARGeoAnchorはいARAnchorRealityKit のサブクラスは、既存のアンカー初期化子を使用してアンカー エンティティを作成できます。

使用上の重要なポイント:

  • ARGeoAnchor地理座標に基づいて ARKit アンカーを表します。
  • RealityKit は、この ARKit アンカー ポイントに基づいてアンカー エンティティを作成できます。
  • このアンカー エンティティの下にぶら下がった仮想コンテンツは、指定された実際の場所に表示されます。
  • セッションの説明ロケーション アンカーは新しいものを使用しますARGeoTrackingConfiguration、手動で構成して開始する必要がありますARViewセッション。

なぜならARGeoTrackingConfigurationワールドトラッキング設定ではないため、Scene Understanding と他の機能は同時に動作しません。屋外ロケーション コンテンツを作成する場合、地理的アンカリング機能と LiDAR シーン理解機能を個別に設計する必要があります。


重要ポイント

1. 現実の障害物を回避できる AR キャラクターを作成する

  • やるべきこと: 仮想ペットやゲームの敵を実際のテーブル、木の幹、階段に沿って移動させ、障害物に近づいたら方向転換させます。
  • 実行する価値がある理由: Scene Understanding のレイキャストは現実世界のエンティティを検出できるため、キャラクターの動作はプリセット平面のみに依存しなくなります。
  • 開始方法: 有効にする.collision、使用arView.scene.raycastキャラクターからその方向に向けて光線を発射し、HasSceneUnderstanding現実世界の結果をフィルタリングします。

2. 動画テクスチャを使ったAR操作ガイドの作成

  • 作業内容: 修復手順、フィットネス動作、または製品説明ビデオを AR サーフェスまたはモデル サーフェスに添付します。
  • 価値がある理由: Videomaterial は動的なテクスチャと空間オーディオの両方を提供します。つまり、ユーザーが見ているオブジェクトの隣にコンテンツを添付できることになります。
  • 開始方法: を使用しますAVURLAssetローカルまたはリモートのビデオをロードし、作成しますAVPlayer、 またVideoMaterial(player:)説明パネル エンティティに割り当てられます。

3. 実際の地形によって引き起こされる粉砕またはリバウンドエフェクトを作成する

  • 対処方法: 仮想ボールが実際の地面に当たるとバウンドするか、階段に当たった後に仮想オブジェクトがフラグメント モデルに切り替わります。
  • 価値がある理由: 衝突イベントはシーン理解エンティティを認識でき、オブジェクトは現実世界のメッシュに応答できます。
  • 開始方法: 有効にする.physicsそして.collision、サブスクリプションCollisionEvents.Began、コールバックで使用されますHasSceneUnderstanding現実世界に登場するかどうかを決定します。

4. 屋外の場所の AR マーカーを作成する

  • やるべきこと: 公園、キャンパス、または展示会では、特定の座標に標識、ルートのヒント、または記念コンテンツを配置します。
  • 価値がある理由: ロケーション アンカーを使用すると、RealityKit コンテンツを現在のスキャン スペース内に単に浮遊するのではなく、実際の地理的位置にバインドできます。
  • 開始方法: を使用しますARGeoAnchor地理的アンカーを作成して使用するAnchorEntity(anchor:)コンテンツをマウントして ARView 用に起動するARGeoTrackingConfiguration

5. AR リソースの品質検査ツールを作成する

  • 何をすべきか: 内部デバッグ メニューで法線、テクスチャ座標、マテリアル パラメータ、および PBR 出力の視覚化を切り替えます。
  • 実行する価値がある理由: DebugModelComponent はモデル レンダリング属性を直接公開できるため、USDZ インポートおよびマテリアル設定の問題のトラブルシューティングに適しています。
  • 開始方法: 現在選択されているModelEntity設定DebugModelComponent、マルチレイヤー USDZ をチェックする必要があるサブエンティティにコンポーネントを再帰的に追加します。

関連セッション

コメント

GitHub Issues · utterances