WWDC Quick Look 💓 By SwiftGGTeam
Create parametric 3D room scans with RoomPlan

Create parametric 3D room scans with RoomPlan

元の動画を見る

ハイライト

Apple のプロトタイピング チームの Praveen とビデオ エンジニアリング チームの Kai が共同で新しい RoomPlan フレームワークを紹介します。 RoomPlan は、ARKit と機械学習アルゴリズムを使用して、LiDAR 搭載デバイスで部屋をスキャンし、壁、窓、開口部、ドア、部屋内の重要な物体 (暖炉、ソファ、テーブル、キャビネットなど) を自動的に検出します。


主要内容

インテリア デザイン、物件の紹介、または家具のプレビューを行う場合、開発者は多くの場合、部屋のモデルを必要とします。以前は、これは多くの場合、カメラ、深度データ、ジオメトリの再構築、オブジェクト認識、および 3D エクスポートを自分で処理することを意味していました。各ステップには、特殊な機械学習またはコンピューター ビジョン機能が必要です。

RoomPlan は、このプロセスをフレームワークに組み込みます。 LiDAR を搭載した iPhone または iPad 上で実行され、ARKit が提供する空間理解機能と機械学習モデルを使用して部屋のパラメトリック 3D モデルを生成します。 (01:01)

パラメータ化はこのスピーチのキーワードです。 RoomPlan の出力には、理解できないグリッドではなく、セマンティック構造が含まれています。壁、ドア、窓、開口部、および部屋を定義するソファ、テーブル、ベッド、キャビネットなどのオブジェクトを識別し、それらを次のように整理します。CapturedRoom構造。 (01:21)

Apple は 2 階建ての入り口を提供しています。 (02:57)

最初の層はRoomCaptureView。これは、ライブ輪郭、下部 3D プレビュー、テキスト ガイダンスを担う、すぐに使えるスキャン インターフェイスです。スキャン体験に素早くアクセスしたいアプリに適しています。

2番目の層はRoomCaptureSession。リアルタイムのパラメータ化されたデータとユーザー指示を公開します。 AR インターフェイスをカスタマイズし、スキャン結果を独自の視覚化システムにオーバーレイする必要があるアプリに適しています。


詳細

RoomCaptureView を使用してスキャンにすばやくアクセスします

03:30RoomCaptureViewですUIViewサブクラス。ワールド空間でのスキャン フィードバック、リアルタイムの部屋モデル生成、コーチング、およびユーザー プロンプトを処理します。

アクセス スキャンでは、ビュー参照とセッション構成を保持し、キャプチャ セッションを開始または停止するだけで済みます。 (04:36)

import UIKit
import RoomPlan

class RoomCaptureViewController: UIViewController {

    var roomCaptureView: RoomCaptureView
    var captureSessionConfig: RoomCaptureSession.Configuration

    private func startSession() {
        roomCaptureView.captureSession.run(configuration: captureSessionConfig)
    }

    private func stopSession() {
        roomCaptureView.captureSession.stop()
    }
}

キーポイント:

  • import RoomPlanRoomPlan フレームワークの紹介。 -RoomCaptureViewApple が提供するスキャン インターフェイスをホストします。 -RoomCaptureSession.Configurationこのスキャンの構成を保存します。 -run(configuration:)スキャンを開始し、設定を内部キャプチャ セッションに渡します。 -stop()スキャンが終了すると、フレームワークは処理と結果の表示フェーズに入ることができます。

このコードの背後にある価値は、スキャン UI 全体を記述する必要がなくなることです。 RoomCaptureView は、スキャン中に検出された壁、窓、ドア、開口部、オブジェクトの輪郭を表示し、基礎となる 3D モデルでスキャンの進行状況も表示します。 (04:01)

スキャン結果を処理して USDZ をエクスポートする

(05:00) アプリが結果処理を引き継ぐ必要がある場合、それを実現できます。RoomCaptureViewDelegate。スピーチでは 2 つのコールバックが示されました。1 つは後処理結果を表示するかどうかを決定するコールバック、もう 1 つは最終結果を取得するコールバックです。CapturedRoom

import UIKit
import RoomPlan

class RoomCaptureViewController: UIViewController {
    func captureView(shouldPresent roomDataForProcessing: CapturedRoomData, error: Error?) -> Bool {
        // Optionally opt out of post processed scan results.
        return false
    }

    func captureView(didPresent processedResult: CapturedRoom, error: Error?) {
        // Handle final, post processed results and optional error.
        // Export processedResults
        try? processedResult.export(to: destinationURL)
    }
}

キーポイント:

  • CapturedRoomDataスキャンして後処理を待つことで得られたデータです。 -captureView(shouldPresent:error:)戻るfalse、アプリはフレームワークによって提供される後処理結果インターフェイスを表示しないことを選択できます。 -CapturedRoomは、後処理されたパラメトリック部屋モデルです。 -export(to:)結果を指定した URL にエクスポートし、USDZ ワークフローで使用できます。
  • コード内destinationURLアプリケーションサンドボックスにファイルパスを記述するなど、アプリ自身で準備する必要があります。

このステップにより、RoomPlan が既存の 3D ツールチェーンを利用できるようになります。スピーチの後半では、エクスポートされた USD または USDZ を使用して、Cinema 4D などのツールで階層、サイズ、位置を表示できるほか、不動産、電子商取引、ツール、インテリア デザイン アプリケーションのレンダリング プロセスに入力することもできると述べられました。 (12:12)

RoomCaptureSession を使用してスキャン エクスペリエンスをカスタマイズする

(05:40) ビジュアルプレゼンテーションをカスタマイズする必要がある場合は、Data API を直接使用できます。このプロセスは、スキャン、処理、エクスポートの 3 つのステップに分かれています。

スキャン段階で使用RoomCaptureSession。また、基礎となるものを提供しますARSession、アプリが独自に実行できるようにしますARViewで平面とオブジェクトの境界ボックスを描画します。 (06:50)

import UIKit
import RealityKit
import RoomPlan
import ARKit

class ViewController: UIViewController {
    @IBOutlet weak var arView: ARView!
    var previewVisualizer: Visualizer!

    lazy var captureSession: RoomCaptureSession = {
        let captureSession = RoomCaptureSession()
        arView.session = captureSession.arSession
        return captureSession
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        captureSession.delegate = self
        // set up previewVisualizer
    }
}

キーポイント:

  • RealityKit供給ARView、カスタム AR 画像をホストするために使用されます。 -RoomCaptureSession()低レベルのスキャン セッションを作成します。 -captureSession.arSessionRoomPlan で使用される AR セッションを公開します。 -arView.session = captureSession.arSessionカスタム ARView で同じ AR セッションを使用します。 -captureSession.delegate = self現在のコントローラーにリアルタイムの部屋の更新とスキャン コマンドを受信させます。

ここでの主な違いはコントロールです。 RoomCaptureView は完全なインターフェイスを提供します。 RoomCaptureSession はデータとイベントを提供します。カスタム アプリは、RoomPlan のリアルタイム結果を独自のブランド インターフェイスに描画したり、既存の AR コンテンツと同じシーンに配置したりできます。

リアルタイムの部屋モデルとスキャン コマンドを受信

07:40RoomCaptureSessionDelegate2 種類のリアルタイム フィードバックが提供されます。CapturedRoomアップデートとInstruction命令。

extension ViewController: RoomCaptureSessionDelegate {

    func captureSession(_ session: RoomCaptureSession,
                        didUpdate room: CapturedRoom) {
        previewVisualizer.update(model: room)
    }

    func captureSession(_ session: RoomCaptureSession,
                        didProvide instruction: Instruction) {
        previewVisualizer.provide(instruction)
    }
}

キーポイント:

  • didUpdate room:部屋の変更が検出されたときに呼び出されます。 -CapturedRoomは、プレビュー モデルの更新に使用できるリアルタイムのパラメトリック部屋データです。 -previewVisualizer.update(model:)アプリ独自のビジュアル ロジックを表します。 -didProvide instruction:スキャンプロセス中にユーザーにガイダンスを提供します。 -Instructionカバーされる距離、スキャン速度、照明調整、および懸念されるテクスチャ領域。

指示は重要です。 RoomPlan のスキャン品質は、人の動き方、距離、速度、光に関係します。フレームワークはこのフィードバックを公開し、開発者はそれを UI コピー、アイコン、または音声プロンプトに変換できます。 (08:33)

RoomBuilder を使用して最終モデルを生成する

(09:04) スキャンが完了すると、RoomBuilder加工を担当CapturedRoomData、最終的なものを生成しますCapturedRoom。使用したスピーチ例.beautifyObjectsオプション。

import UIKit
import RealityKit
import RoomPlan
import ARKit

class ViewController: UIViewController {

    @IBOutlet weak var arView: ARView!
    var previewVisualizer: Visualizer!

    // set up RoomBuilder
    var roomBuilder = RoomBuilder(options: [.beautifyObjects])
}

キーポイント:

  • RoomBuilderこれは、スキャンされたデータの後処理のエントリ ポイントです。 -options: [.beautifyObjects]RoomPlan が提供するオブジェクトの美化オプションを使用します。 -RoomBuilder通常、そしてRoomCaptureSession一緒に使用されます。 -previewVisualizer加工後の最終モデルのプレゼンテーションを担当します。

いつRoomCaptureSession停止またはエラーが発生した場合、デリゲートは次のメッセージを受け取ります。CapturedRoomDataおよびオプションのエラー。最終的な部屋モデルは、Swift 同時実行性を使用して非同期的に生成できます。 (09:30)

extension ViewController: RoomCaptureSessionDelegate {
    func captureSession(_ session: RoomCaptureSession,
                        didEndWith data: CapturedRoomData, error: Error?) {
        if let error = error {
            print("Error: \(error)")
        }

        Task {
            let finalRoom = try! await roomBuilder.capturedRoom(from: data)
            previewVisualizer.update(model: finalRoom)
        }
    }
}

キーポイント:

  • didEndWith data:スキャンが停止したとき、またはエラーが発生したときにトリガーされます。 -CapturedRoomData後処理のためにセンサーのスキャンデータを保存します。 -Task非同期コンテキストを作成します。 -await roomBuilder.capturedRoom(from: data)スキャンデータを非同期的に処理します。 -finalRoom最終的ですCapturedRoom、表示、分析、またはエクスポートに使用できます。

プレゼンテーションでは、このプロセスには通常数秒しかかからないことが説明されています。 Swift async/await を使用するため、後処理は UI をブロックする同期プロセスとして記述されません。 (09:45)

CapturedRoom の構造を理解する

(10:17) RoomPlan の出力はパラメーター化された構造です。トップレベルCapturedRoomによるSurfaceそしてObject構成。

public struct CapturedRoom: Codable, Sendable {
    public let walls: [Surface]
    public let doors: [Surface]
    public let windows: [Surface]
    public let openings: [Surface]
    public let objects: [Object]

    public func export(to url: URL) throws

    // Surface definitions ...

    // Object definitions ...
}

キーポイント:

  • CapturedRoomフォローするCodableコーディングと永続化に便利です。 -Sendable同時実行の境界を越えて安全に渡すことができることを示します。 -wallsdoorswindowsopenings全てSurface配列。 -objects講義では直方体として説明されている、部屋内の 3D オブジェクトを保存します。 -export(to:)パラメータ化された結果を USD または USDZ データとしてエクスポートします。

Surface壁、ドア、窓、開口部などの建築要素が含まれています。スピーチでは、半径、開始角度と終了角度、4 つの側面などのサーフェス関連のプロパティがあると述べました。サイズ、信頼度、3D 変換行列、一意の識別子も含まれます。 (10:26)

Objectテーブル、ベッド、ソファなどの家具のカテゴリを示します。また、寸法、信頼度、3D 変換行列、一意の識別子も付属しています。 (10:49)

スキャン条件は結果に影響します

(13:09) RoomPlan は、居住用の 1 部屋に最適です。プレゼンテーションで示された部屋の上限は、30 フィート×30 フィート、約 9 メートル×9 メートルでした。

光もスキャンに影響を与える可能性があります。 Apple は少なくとも 50 ルクスを推奨しています。これは、夜の家庭のリビングルームの一般的な明るさとほぼ同じです。ハードウェア的には、RoomPlan は LiDAR を搭載したすべての iPhone および iPad Pro モデルをサポートしています。 (13:38)

環境によっては、全身鏡、ガラス、高い天井、非常に暗い表面など、課題が発生します。その理由は、それぞれ、LiDAR の予想される出力、LiDAR のスキャン距離、およびビデオ ストリームの品質に由来します。 (14:02)

スキャンする前に部屋を準備することもできます。カーテンを開けると自然光が増え、窓の遮蔽が軽減されます。ドアを閉めると、部屋の外のエリアをスキャンする可能性が低くなります。高精度のシナリオでは、これらの準備手順をスキャン前のプロンプトに組み込む必要があります。 (14:27)

最後に、電力と熱放散があります。 Apple は、繰り返しのスキャンや 5 分を超える 1 回のスキャンを避けることをお勧めします。長時間スキャンすると疲労、電力消費、熱の問題が発生する可能性があり、アプリのエクスペリエンスに影響を与えます。 (15:16)


重要ポイント

  • やるべきこと: 自動ルーム モデリング ポータルをインテリア デザイン アプリに追加します。 価値がある理由: RoomPlan は壁、窓、ドア、開口部、主要な家具を認識し、デザイン ツールはこれらに直接基づいて作成できます。CapturedRoom壁の色の変更、面積の見積もり、レイアウトのプレビューを行います。 開始方法: 最初に使用しますRoomCaptureViewスキャンループを完了してから、captureView(didPresent:error:)読み込むCapturedRoom

  • やるべきこと: 不動産仲介ツール用の部屋の 3D モデルと USDZ ファイルを生成します。 実行する価値がある理由: プレゼンテーションでは、エージェントが物件の間取り図や 3D モデルを取得できる不動産アプリについて明示的に言及しました。 開始方法: スキャン完了後に呼び出されますCapturedRoom.export(to:)、結果をアプリ ファイル ディレクトリに保存し、ビジネス バックエンドまたはローカル プレビューにアップロードします。

  • 何をすべきか: カスタム スキャン ブート インターフェイスを作成します。 実行する価値がある理由:Instruction距離、速度、照明、テクスチャ領域に関するフィードバックが提供され、アプリはそれを製品のトーンによりよく適合するガイダンスに変えることができます。 開始方法: を使用しますRoomCaptureSessionDelegate、存在するdidProvide instruction:独自のプロンプト コンポーネントを更新します。

  • 何をすべきか: 電子商取引の家具のプレビューと実際の部屋の構造を組み合わせます。 実行する価値がある理由: RoomPlan によって出力される壁、開口部、家具の位置は、製品の配置に空間コンテキストを提供できます。 開始方法: を使用しますRoomCaptureSessionリアルタイムを取得するCapturedRoom、RealityKit シーンのスキャンされた部屋構造に製品モデルを配置します。

  • やるべきこと: 高精度スキャンのための部屋の準備プロセスを設計します。 実行する価値がある理由: この講演では、照明、鏡、ガラス、ドア、スキャン時間に制限が設けられています。早めに起動すると、スキャンの失敗を減らすことができます。 起動方法:起動時run(configuration:)事前にチェックリストを追加します。カーテンを開け、ドアを閉め、鏡やガラスを避けるように注意し、1 回のスキャンは 5 分以内にするように注意します。


関連セッション

  • Discover ARKit 6 - ARKit 6 は、カメラ、トラッキング、平面機能を強化し、RoomPlan の背後にある AR 基盤を補完します。
  • あなたの世界を拡張現実に — Object Capture と RealityKit は、現実のオブジェクトを AR に取り込む別の方法を示しています。
  • USD の基礎を理解する — RoomPlan は USD または USDZ をエクスポートできます。この講演では、USD の基本概念とコンテンツ パイプラインについて説明します。
  • 優れた AR エクスペリエンスの品質 - RoomPlan のスキャン エクスペリエンスには、明確なガイダンスと状況に応じたフィードバックが必要であり、この講演は AR 設計原則を補完します。

コメント

GitHub Issues · utterances