リアルキットで拡張現実体験を造る入門

拡張現実(AR)は、仮想オブジェクトと現実をブレンドするインタラクティブな体験を、物理的な世界へデジタルコンテンツをオーバーレイします。AppleのRealityKitフレームワークは、開発者にiOS用のARアプリを構築するための高レベル、パフォーマントAPIを提供します。この記事は、セットアップ、エンティティティ・コンポーネントアーキテクチャ、ユーザーインタラクション、アニメーション、物理、コラボレーション、最適化に関する基礎的な展開に展開します。最後に、SwiftとRealityKitを使用して、洗練されたARエクスペリエンスを作成する方法の実用的な理解を持っています。

開始: プロジェクトのセットアップと要件

仮想デバイスは、A9チップまたは新しい(iPhoneSE、6秒、以降)を搭載したiOSデバイスをXcode 13以降、A9チップまたは新しいiOSデバイス(iPhoneSE、6秒、およびiPad 5以降)、Apple Developerアカウントでテストする必要があります。 iOSシミュレータはカメラやセンサーデータをサポートしていません。そのため、実際のデバイステストは不可欠です。

新しいXcodeプロジェクトを作成し、[]]を選択します。 拡張現実アプリ[テンプレート。 設定に応じてSwiftUIまたはUIKitを選択します。 RealityKitはシームレスに動作します。 テンプレートは]と基本的なシーンの設定を提供します。

あるいは、フレームワークをインポートすることで、既存のプロジェクトにRealityKitを手動で追加できます。

import RealityKit
import ARKit

NSCameraUsageDescription が ] に設定されていることを確認します。アプリがカメラアクセスを必要とする理由を説明するユーザーフレンドリーな文字列です。

詳細は、Appleの[]を参照してください。RealityKitのドキュメント[と[]]アークイトのドキュメント[を参照してください。

エンティティ・コンポーネント・システムについて

RealityKit は、シーンの構成に根ざす「Entity-Component[アーキテクチャを使用しています。]は、コンポーネントを保持するコンテナです。コンポーネントは、その振る舞い、出現、物理、およびその他の特性を定義します。例えば、は、3Dメッシュを定義し、は、位置/回転/スケールを処理します。は、物理をシミュレーションすることができます。

このモジュール式アプローチにより、複雑なオブジェクトを簡単に構成できます。エンティティティティティティティを作成し、コンポーネントを添付し、階層に配置します。シーンのルートはです。(通常)、仮想コンテンツをARKitによって検出された実際の場所と結びつけます。

アンカーの作成とコンテンツの追加

最も一般的なアンカーは、水平または垂直面にコンテンツを添付する平面アンカーです。 認識された平面に3Dモデルを配置する方法は次のとおりです。

// Load a USDZ model
guard let model = try? ModelEntity.load(named: "robot") else { return }

// Create an anchor on any horizontal plane
let anchor = AnchorEntity(plane: .horizontal, classification: .any, minimumBounds: [0.2, 0.2])

// Attach the model to the anchor
anchor.addChild(model)

// Add the anchor to the ARView’s scene
arView.scene.addAnchor(anchor)

を使って特定の世界位置でアンカーを作成したり、 または を使用して画像や顔を検出するためにコンテンツを付けたりすることもできます。

ベーシックなARシーンを現実に構築する

シンプルなモデル配置を超えて、ARビューのライフサイクルを管理する必要があります。 UIKitアプリでは、ビューコントローラーに[を追加してください。

class ViewController: UIViewController {
 @IBOutlet var arView: ARView!

 override func viewDidLoad() {
 super.viewDidLoad()
 arView.session.delegate = self
 // Configure session
 let config = ARWorldTrackingConfiguration()
 config.planeDetection = [.horizontal, .vertical]
 arView.session.run(config)
 loadContent()
 }

 func loadContent() {
 // Create and add anchors
 }
}

SwiftUI では、SwiftUI 階層に をブリッジする を埋め込む。

ユーザーインタラクション: ゲスチャリングとヒットテスト

ARアプリをインタラクティブにするには、ユーザのタップ、ドラッグ、および回転を処理する必要があります。 RealactKitは、ユーザーがどのエンティティティティティティティを識別するために、ヒットテストを提供します。

タップして場所やインターアクティブに

を]に追加します。 ゲスチャーハンドラでは、指の下のエンティティティティを取得するためにを呼び出します。

arView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))))

@objc func handleTap(_ sender: UITapGestureRecognizer) {
 let location = sender.location(in: arView)
 if let entity = arView.entity(at: location) {
 // Scale the entity
 var transform = entity.transform
 transform.scale *= 1.2
 entity.move(to: transform, relativeTo: entity.parent, duration: 0.3, timingFunction: .easeInOut)
 } else {
 // Place a new object at the tapped location
 placeObject(at: location)
 }
}

func placeObject(at screenPoint: CGPoint) {
 let results = arView.raycast(from: screenPoint, allowing: .estimatedPlane, alignment: .any)
 guard let result = results.first else { return }
 let anchor = AnchorEntity(world: result.worldTransform)
 let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .blue, isMetallic: false)])
 anchor.addChild(box)
 arView.scene.addAnchor(anchor)
}

実際の面からレイキャスティングするのは、平面にコンテンツを配置したいときに、エンティティティがヒットするよりも信頼性が高いです。 これをを使用してください。

ジオスチャーをドラッグ&ローテーション

ドラッグを有効にするには、[をつけて、そのフィールドの位置を平面に沿って更新します。 回転のために、を使用します。

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
arView.addGestureRecognizer(panGesture)

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
 let location = sender.location(in: arView)
 guard let entity = arView.entity(at: location) else { return }
 guard let parent = entity.parent as? HasAnchoring else { return }
 // Translate the entity in the anchor’s local plane
 let translation = sender.translation(in: arView)
 // ... (convert to 3D movement)
}

堅牢な実装では、RealityKit の []] パッケージ、または の iOS 16 で gesture プロパティー を使用して検討します。

高度な機能:アニメーション、物理、コラボレーション

アニメーション

RealityKit は、骨格アニメーション (USDZ ファイルから) とプロパティベースのアニメーションの両方をサポートしています。アニメーションリソースを使用してモデルに組み込みアニメーションをトリガーするには:

guard let model = try? ModelEntity.load(named: "dancing_character") else { return }
model.playAnimation(model.availableAnimations[0].repeat(duration: .infinity), transitionDuration: 0.5, startsPaused: false)

以前の[メソッドを使用して変換、不透明、またはカスタムパラメータをアニメーション化することもできます。複雑なシーケンスでは、またはを使用します。

物理シミュレーション

重力、衝突、力を可能にするために[を取り付けます。

let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .red, isMetallic: false)])
box.position = [0, 0.5, 0] // above a plane

let physicsBody = PhysicsBodyComponent(
 massProperties: .default,
 material: .generate(staticFriction: 0.8, dynamicFriction: 0.5, restitution: 0.3),
 mode: .dynamic
)
box.components.set(physicsBody)

let collision = CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])
box.components.set(collision)
// Add box to anchor anchor.addChild(box)

箱は平面に落ち、衝突に反応します。静的なオブジェクト(壁のような)はを持っている必要があります。

コラボレーションARセッション

ARKitのコラボレーションセッションでは、複数のデバイスが同じAR世界をシェアできます。セッションのコラボレーションオプションを設定することでコラボレーションを有効にします。

config.collaborationEnabled = true
arView.session.run(config)

をネットワークフレームワーク(例えば、マルチピアコネクティビティ)を介して他のピアに送信します。 各デバイスのRealityKitシーンは同期されます。 これは、マルチプレイゲームや共有デザインのレビューに最適です。

スムーズなAR体験を実現するパフォーマンスの最適化

ARアプリは、モーションの病気を避けるために、高フレームレート(60 fps)を要求します。 これらの慣行に従ってください:

  • [] は、低ポリモデル を使用し、最適化されたUSDZファイルを使用します。 頂点は低速で、圧縮されたテクスチャ(KTXまたはPNG)を使用します。
  • ]シーン内のエンティティティの件数を制限します。 を使用して、デバッグカウントします。
  • [] インスタンス化によるドローコールの最小化 は、複数のエンティティティティ間で同じモデルを共有します。
  • ] レンダリング品質をで調整します。
  • []]モデルロード[]]]を使用して、メインスレッドをブロックしないようにします。 背景キューにモデルをロードし、準備ができたらそれらを提示します。
  • ]ARセッションのライフサイクル管理:アプリがバックグラウンドに進むとを呼び出し、前面の設定を再実行します。

詳細なガイダンスについては、Appleのを参照してください。没入型AR体験と[]]]]を生成し、AR体験をトラブルシューティング[]]]を参照してください。

直感的なARインターフェイスの設計

AR のユーザーエクスペリエンスは、従来のアプリとは異なる。以下の原則に従ってください。

  • []表面検出フィードバック[]]:検出された平面をグリッドまたは輪郭で視覚化し、ユーザーはオブジェクトを配置する場所を知っている。
  • : 抽象的な制御ではなく、直接操作(タップ、ドラッグ、ピンチ)を使う。
  • ビジュアルヒント[]を提供します。 ハイライトインタラクティブなエンティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティティや、有効なプレーンでユーザーポイントをするときのクロスヘアショー。
  • ]ハンドル照明]:RealityKitは、自動的に現実的な光を推定し、仮想オブジェクトにそれを適用することができます。 ]]を使用して強度を調整します。
  • []さまざまな環境でテスト]:異なる照明、テクスチャ、部屋のサイズはARトラッキングに影響を与えます。平均条件を最適化します。

ARアプリのデバッグとテスト

実際のデバイステストは、非交渉可能です。Xcodeの[]]をARKitデバッグ機能を使用してください。

  • 機能ポイント、世界起源、物理線枠を表示するには、[を有効にします。
  • ログを使用して、表面が検出されたときに確認します。
  • トラッキング状態とエラーを監視するために[を追加します。
  • 複数のデバイス生成(例、iPhone 8 vs iPhone 14 Pro)でパフォーマンスを測るテスト。

自動UIテストでは、ARデータをモックすることができますが、マニュアルテストは精度のために不可欠です。

コンテンツ

RealityKit は AR 開発の複雑さを多く抽象化していますが、洗練された経験を築くには、エンティティティティ アーキテクチャ、ユーザー インタラクション、パフォーマンス、デザインに注意が必要です。 カバーされた技術の組み合わせにより、シーンのセットアップとジェスチャーの処理から物理とコラボレーションまで、ユーザーが関与する AR アプリケーションを作成したり、iOS ハードウェアのフル ポテンシャルを活用することができます。 Apple の進化する AR フレームワークで常にテストを行い、シームレスで没入的なエクスペリエンスを実現します。