ハイライト
RealityKit 2 では、カスタマイズ システム、PhysicallyBasedmaterial、アニメーション ブレンディング レイヤー、キャラクター コントローラー、ランタイム リソース生成が導入されており、AR アプリケーション開発を「モデルの配置」から「完全なインタラクティブ エクスペリエンスの構築」にアップグレードできるようになります。
主な内容
RealityKit が 2019 年にリリースされたとき、その位置付けは「AR 開発を容易にする」というものでした。USDZ モデルをロードし、検出された平面上に配置し、わずか数行のコードで実行します。
しかし、開発者のフィードバックは明らかです。より多くの制御が必要です。カスタム シェーダ、カスタム ゲーム ロジック、より柔軟なアニメーション、物理インタラクション - これらを RealityKit 1 で実装するのは困難でした。
WWDC2021 への答えは RealityKit 2 です。セッションは水中 AR デモでずっと続きます。魚の群れがリビング ルームを泳ぎ、ダイバーがソファと床の間を飛び跳ね、タコは怯えると色を変えて逃げます。これらのエフェクトはすべて、新しい API を使用して実装されます。
##詳細
カスタム システム: 純粋な ECS アーキテクチャ
RealityKit 2 は、より純粋な ECS (Entity Component System) アーキテクチャに向けて進化しています。関数は System に配置され、状態は Component に配置され、Entity はコンポーネントの単なる識別子です。
class FlockingSystem: RealityKit.System {
required init(scene: RealityKit.Scene) { }
static var dependencies: [SystemDependency] { [.before(MotionSystem.self)] }
private static let query = EntityQuery(where: .has(FlockingComponent.self)
&& .has(MotionComponent.self)
&& .has(SettingsComponent.self))
func update(context: SceneUpdateContext) {
context.scene.performQuery(Self.query).forEach { entity in
guard var motion: MotionComponent = entity.components[MotionComponent.self]
else { continue }
// Boids 模拟:分离、聚合、对齐
motion.forces.append(/* forces */)
entity.components[MotionComponent.self] = motion
}
}
}
キーポイント:
- 従うべきカスタムシステム
RealityKit.System合意 (07:10) dependencies実行順序を指定し、.before(MotionSystem.self)このシステムがモーション システムよりも前に実行されていることを確認してくださいEntityQueryシーン グラフ全体を走査することなく、システムに参加しているエンティティを効率的にフィルタリングします。- コンポーネントは Swift 構造体 (値型) であり、変更後にエンティティに書き戻す必要があります。
- に準拠
Codableマルチプレイヤー AR の自動ネットワーク同期用コンポーネント (08:15)
アーキテクチャの変更: ゲームマネージャーの役割が弱体化
以前は、各フレームの更新ロジックは次のように記述されていました。SceneEvents.updateクロージャ。通常は Game Manager クラスに集中します。現在、更新ロジックは別のシステムに分割され、依存関係の順序でエンジンによって呼び出されます。
以前は、コンポーネントの構成はエンティティのサブクラスのプロトコル準拠を通じて表現されていました。Entity をサブクラス化する必要がなくなり、実行時にコンポーネントを動的に追加および削除できるようになりました。
// 新方式:运行时添加/移除组件
entity.components[FlockingComponent.self] = FlockingComponent()
entity.components[FlockingComponent.self] = nil
キーポイント:
- ゲーム マネージャーはコンポーネントをエンティティに追加するだけで済み、システムが自動的にロジックを処理します (10:15)
- エンティティのサブクラス化は不要になりました
TransientComponent: 一時的な状態マーカーなど、エンティティのクローン作成時に継承されないコンポーネント (11:25)storeWhileEntityActive: イベント サブスクリプションはエンティティのライフサイクルで自動的に管理されます (11:58)
SwiftUI と RealityKit 間のデータ転送
SwiftUI を使用して設定パネルを構築し、RealityKit のカスタム システムにデータを渡します。
class Settings: ObservableObject {
@Published var separationWeight: Float = 1.6
}
struct ContentView: View {
@StateObject var settings = Settings()
var body: some View {
ZStack {
ARViewContainer(settings: settings)
MovementSettingsView()
.environmentObject(settings)
}
}
}
struct SettingsComponent: RealityKit.Component {
var settings: Settings
}
class UnderwaterView: ARView {
let settings: Settings
private func addEntity(_ entity: Entity) {
entity.components[SettingsComponent.self] =
SettingsComponent(settings: self.settings)
}
}
キーポイント:
Settingsとして@StateObjectそしてenvironmentObjectSwiftUI を渡す (12:36)- として梱包
SettingsComponentエンティティに追加される - カスタムシステムはEntityコンポーネントから設定値を読み取ります
マテリアル システムのアップグレード
RealityKit 2 の新機能PhysicallyBasedMaterialは、USD の材料仕様に準拠しており、SimpleMaterialのスーパーセット。
var faceMaterial = PhysicallyBasedMaterial()
faceMaterial.roughness = 0.1
faceMaterial.metallic = 1.0
faceMaterial.blending = .transparent(opacity: .init(scale: 1.0))
let sparklyNormalMap = try! TextureResource.load(named: "sparkly")
faceMaterial.normal.texture = PhysicallyBasedMaterial.Texture.init(sparklyNormalMap)
faceMaterial.baseColor.texture = PhysicallyBasedMaterial.Texture.init(faceTexture)
faceEntity.model!.materials = [faceMaterial]
キーポイント:
PhysicallyBasedMaterial標準の PBR プロパティが含まれます:baseColor、roughness、metallic、normal、ambientOcclusion、clearcoat など (13:57)- 透明テクスチャと opacityThreshold のサポート (14:35)
VideoMaterial透明度のサポートを追加しました (13:42)CustomMaterialMetal コードでカスタム シェーダを記述できるようにします (15:05)
アニメーションの強化
アニメーション API は、新しいブレンド レイヤ (ブレンド レイヤ) とプロシージャル アニメーションを追加します。
// 动画过渡
entity.playAnimation(animation, transitionDuration: 0.3)
// 混合层:Walking 在上层,Idle 在下层
// 调整 blend factor 控制权重
// 改变 playback speed 控制速度
キーポイント:
transitionDuration新旧アニメーション間の移行をスムーズにする (15:55)- レイヤーのブレンド: 複数のアニメーションが異なるレイヤーで再生され、ブレンド係数によって混合されます (16:22)
- 再生速度を変更してキャラクターの動きを速くしたり遅くしたりします (16:47)
- 地面に対するキャラクターの速度を使用してブレンド係数と速度を制御し、足の滑りを軽減します (16:55)
FromToByAnimationプログラムで変形アニメーションを作成する (18:33)AnimationViewUSD タイムラインから複数のアニメーション クリップをスライスする (17:47)
キャラクターコントローラー
キャラクター コントローラーを使用すると、エンティティがシーン内のコライダーと物理的に対話できるようになります。
// 创建胶囊体形状的角色控制器
let characterController = CharacterController(
height: capsuleHeight,
radius: capsuleRadius
)
entity.components[CharacterControllerComponent.self] =
CharacterControllerComponent(characterController)
// 每帧调用,自动避开障碍物
characterController.move(to: targetPosition)
// 忽略障碍物,直接瞬移
characterController.teleport(to: targetPosition)
キーポイント:
- カプセルの形状はキャラクターの輪郭と一致します (19:55)
move(to:)環境メッシュによる自動衝突検出 (LiDAR 生成) (20:08)teleport(to:)障害物を無視して直進する(20:19)- デモでは、ダイバーはソファと床の間をジャンプし、自動的に部屋のグリッドと対話します。
ランタイムリソースの生成
フェイシャルメッシュ
SceneUnderstanding は顔を認識し、ModelComponent を持つエンティティを返すようになりました。
static let sceneUnderstandingQuery =
EntityQuery(where: .has(SceneUnderstandingComponent.self) && .has(ModelComponent.self))
func findFaceEntity(scene: RealityKit.Scene) -> HasModel? {
let faceEntity = scene.performQuery(sceneUnderstandingQuery).first {
$0.components[SceneUnderstandingComponent.self]?.entityType == .face
}
return faceEntity as? HasModel
}
キーポイント:
SceneUnderstandingComponent.entityType区別する.faceそして.meshChunk(21:26)- 顔エンティティを取得した後、その素材を置き換えることができます
- PencilKit を使用してデモでパターンを描画し、リアルタイムで顔のメッシュに適用します
オーディオバッファ
どれからでもAVAudioBuffer空間オーディオ リソースを作成します。
let synthesizer = AVSpeechSynthesizer()
func speakText(_ text: String, forEntity entity: Entity) {
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-IE")
synthesizer.write(utterance) { audioBuffer in
guard let audioResource = try? AudioBufferResource(
buffer: audioBuffer,
inputMode: .spatial,
shouldLoop: true
) else { return }
entity.playAudio(audioResource)
}
}
キーポイント:
AudioBufferResourceからAVAudioBuffer作成 (23:09)inputMode: .spatial3D 位置オーディオを有効にする- その他のモード:
.nonSpatial、.ambient - 利用可能
AVSpeechSynthesizerテキストを音声に変換するか、マイク入力を録音します
重要ポイント
-
ECS アーキテクチャを使用して AR ゲーム ロジックを編成: 動作を独立したシステムに分割し、状態をコンポーネントに配置します。エンティティは単なる識別子です。これによりコードが明確になり、マルチプレイヤーの同期が容易になります。
-
キャラクター コントローラーにより AR の物理的インタラクションが簡素化: 衝突検出とナビゲーション メッシュを自分で記述する必要はありません。キャラクター コントローラーは、LiDAR によってスキャンされた環境メッシュと自動的に対話します。
-
顔 AR を再生する新しい方法: SceneUnderstanding が提供する顔メッシュ + カスタム マテリアルは、仮想メイクアップ、顔フィルター、表情追跡、その他の効果を実現できます。
-
手続き型オーディオ生成:
AudioBufferResourceAR のサウンド効果はプリセット ファイルに依存しなくなり、オーディオをリアルタイムで合成、処理、適用できます。 -
PBR マテリアルにより仮想コンテンツがよりリアルになります:
PhysicallyBasedMaterialこれは完全な PBR ワークフローを提供し、法線マップやクリアコートなどの高度な属性を使用して、仮想オブジェクトを実際の環境の照明にうまく統合できます。
関連セッション
- オブジェクト キャプチャを使用して 3D モデルを作成 — 写真からリアルな 3D モデルをすばやく作成して、RealityKit のコンテンツ素材を提供します
- ARKit 5 を探索する — ARKit 5 の新機能には、位置アンカーと顔追跡の改善が含まれます
- ARKit でジオメトリ対応オーディオを発見する — ARKit のジオメトリ対応オーディオ
- Render with Metal — メタル レンダリング パイプライン、Custommaterial のシェーダー作成の基礎
コメント
GitHub Issues · utterances