見出し画像

【WWDC23】強化されたRoomPlan(技術者向け要約)

RoomPlanとは

RoomPlanはARKitを使用して、壁や窓、ドアなどの部屋の要素を機械学習アルゴリズムを使用して検出できるAPIです。

https://developer.apple.com/jp/augmented-reality/roomplan/

RoomPlan自体はWWDC22で発表されたAPIです。

WWDC23では、このRoomPlanで使える新たなAPIや強化されたAPIが発表されました。

強化された内容要約

  1. Custom ARSessionのサポート

  2. 複数の部屋のスキャンデータをひとつのデータに結合可能に

  3. スキャン中のVoiceOverによるサポート

  4. より正確なオブジェクト類識別

  5. オブジェクト類識別結果を構造データとして統合した3Dモデルのエクスポート

どれも非常に強力なアップデートで、今後の活用範囲が大幅に広がりました。
各項目の強化内容を以降で解説します。

1.Custom ARSessionのサポート

Custom ARSessionの使用例

iOS 17では、RoomPlanはARWorldTrackingConfigurationを使用してCustom ARSessionを利用することができるようになりました。
これにより、RoomPlanとARKitを組み合わせた新しいワークフローが可能になります。例えば、RoomPlanの結果をARKitのシーンジオメトリや平面検出と組み合わせて、より没入型のインタラクションを実現することができます。

さらに、ARKitの高品質な画像キャプチャを使用して空間の写真表現を収集し、充実した不動産リストを作成することもできます。また、既存のARエクスペリエンスにRoomPlanを組み込むことも可能です。

つまり・・・
これまでより扱いやすくなって、ARKitとかと組み合わせたりしてできることが増えたよって事です。

2.複数の部屋のスキャンデータをひとつのデータに結合可能に

iOS7より、MultiRoomのサポートが行われました。
MultiRoom supportは、RoomPlanにおいて複数の部屋のスキャン結果を1つの大きな構造にマージするための機能です。

これまでのRoomPlanでは、1回のスキャンで1つの部屋の3Dモデルを取得することができました。しかし、ダイニングルーム、キッチン、リビングルーム、廊下、寝室など、家の異なる部屋を複数回スキャンした場合、それらを統合する際にいくつかの課題が発生します。

複数回スキャンした場合別個の部屋モデルができる

まず、各部屋は独自の座標系を持ち、ワールド座標の原点と方向が部屋ごとに異なります。

各部屋のスキャンデータで独自の座標系を持つ

また、手動でつなぎ合わせても、壁やオブジェクトが重複する可能性があります。

黄色:重複した壁

MultiRoom supportは、これらの課題を解決し、複数の部屋をシームレスに統合するための機能です。

このような異なる座標系の問題について、2つのアプローチを提案されています。

1つ目のアプローチは、継続的なARSessionの使用です。以前のRoomPlanでは、RoomCaptureSessionが停止するとARSessionも一時停止されました。新しいAPIでは、stop関数に新しい引数があり、pauseARSessionをfalseに設定することができます。これにより、ARSessionは次のスキャンまで実行を続け、複数のスキャンにわたって同じ座標系を確実に使用することができます。

2つ目のアプローチは、ARSessionの再ローカリゼーションを使用する方法です。この場合、異なる時間に個別の部屋のスキャンを行う場合に適しています。ARWorldMapをディスクに保存し、ARSessionを一時停止した後も再開するために、前のスキャンからARWorldMapをロードすることができます。

これらのアプローチを使用することで、異なる部屋のスキャン結果を同じ座標系で統合することができます。

ARWorldMapを使用することで、以前のスキャンの環境に再ローカライズし、一連のスキャンが共通の座標系を共有できます。再ローカリゼーションを使用した実装フローを以下に示します。

  1. 最初のスキャンを実行し、ARSessionを一時停止します。

  2. 一時停止したARSessionの間にARWorldMapを保存します。

  3. 2回目のスキャンを行う前に、以前のARWorldMapを復元します。ARWorldMapをロードし、ARWorldTrackingConfigurationに割り当てます。

  4. ARSessionを再実行して再ローカリゼーションをトリガーします。

  5. 再ローカリゼーションが完了すると、以前のARSessionがロードされ、現在のワールド座標が以前のワールド座標と一致します。

  6. 2回目のスキャンを実行し、最後に停止します。

これらの手順により、1回目と2回目のスキャン結果は同じ3Dワールド座標でリンクされます。

以上が、複数のスキャンを同じ座標系でリンクするための2つのアプローチです。

RoomBuilder API

RoomBuilder APIを使用することで、各スキャンごとに個別のCapturedRoomを生成できます。継続的なARSessionとARSessionの再ローカリゼーションにより、すべてのCapturedRoomが同じ3Dワールド空間内に存在します。以下は、RoomBuilderからの出力例であり、3つのCapturedRoomを含んでいます。

現在、CapturedRoomを1つの大きな構造であるCapturedStructureにマージするための新しいマージAPIであるStructureBuilderが提供されています。

以下はStructureBuilder APIのを使った実装フローです。

  1. 構成オプションを使用してStructureBuilderインスタンスを作成します。

  2. 前にスキャンした複数のCapturedRoomをロードする配列を作成します。

  3. StructureBuilder APIを呼び出して、マージされたCaptureStructureを取得します。

  4. 最後に、CaptureStructureをUSDZファイルにエクスポートすることができます。

CapturedStructureは部屋のプロパティや結合された壁、ドア、窓、開口部、オブジェクトのプロパティを持ち、USDZファイルにエクスポートする機能もあります。

これにより、StructureBuilder APIを使用して複数のスキャンを結合し、USDZファイルにエクスポートできるサンプルアプリが提供されます。USDZファイルはiOSとmacOSの両方でプレビューすることができ、Blenderなどのデジタルコンテンツ作成ツールにロードすることでさらに加工することができます。

MultiRoom supportについての考慮事項が存在します。
考慮事項は以下の通りです。

  • MultiRoomは、ベッドルーム1〜4室、リビングルーム、キッチン、ダイニングルームといった一般的な平屋住宅のセットアップが最適

  • 個々の部屋をスキャンして結合する場合、最大2,000平方フィート(約186平方メートル)の総面積を推奨

  • RoomPlanが鮮明なビデオストリームと優れたAR追跡パフォーマンスでスキャンできるようにするために、50ルクス以上の適切な照明を使用することを推奨

以上がMultiRoom supportに関する考慮事項です。

3.スキャン中のVoiceOverによるサポート

通常、人々はレンダリングについて話すときに視覚的な手法を想像しますが、視覚に制限のある人々にとってはそれが最も有益な手法ではありません。そのため、RoomPlanにはVoiceOverが有効な場合に音声フィードバックが追加され、スキャンに関するガイドラインを提供し、表示されるコンテンツを説明することができるようになりました。

この機能は、いわゆるアクセシビリティについてのアップデートですが、RoomPlanの説明の中で数分程度しか登場しません。

しかし、WWDC23で同時に発表されたVision Proの可能性を気づかせてくれるものの一つでもあります。
あまり注目されていない機能ですが、Vision Proで同様のアクセシビリティを実装された場合は、資格に制限のある人々にとって非常に強力なデバイスになると考えられます。

4.より正確なオブジェクト類識別

RoomPlanは、さまざまな部屋を簡単にスキャンできるツールですが、過去には限定的な部屋の状況しか正確に表現できませんでした。
しかし、今回のアップデートにより、傾斜した壁や湾曲した壁、埋め込み型のキッチン要素(食器洗い機、オーブン、シンクなど)を含む、より多様な部屋をサポートできるようになりました。

今回のアップデートでサポートされた部屋の構造例

また、特定のカテゴリのオブジェクトの構成も検出できるようになりました。たとえば、新しいバージョンでは、1人掛けからL字型やシンプルな四角いソファまで、さまざまな種類のソファを検出できます。

異なる形状のソファを種類ごとに検出可能

さらに、これまでのRoomPlanはSurfaceとObjectの2つの要素をスキャンできましたが、今回のアップデートで部屋内のエリアを記述するための新しい要素であるSectionが追加されています。これにより、壁をポリゴンとして記述し、処理することができます。

今回RoomPlanは、不均一な壁や湾曲した壁、窓などを正確にレンダリングできるようになりました。SurfaceのCategoryにfloorが追加され、ポリゴンとして表現できます。

また、Objectにはカテゴリ内のさまざまな構成をより適切に説明する属性が追加されました。
SurfaceとObjectに新しい親変数が追加されており、これには親の識別子が含まれます。 たとえば、窓の親は壁、椅子の親はテーブル、食器洗い機の親は収納庫などです。

Sectionでは、部屋や家のさまざまなエリアについて説明します。 セクションには、リビングルーム、ベッドルーム、バスルーム、キッチン、ダイニングルームなどのラベルがあります。 特定のフロアの特定の位置を持っています。


不均一な壁はポリゴンとしてレンダリングでき、床はスキャン中は長方形で表示され、後で多角形に変換されます。埋め込み型のキッチン要素(食器洗い機、オーブン、シンク)はレンダリングされます。

不均一な壁のレンダリング
多角形に変換された床

椅子を例に挙げると、下図のように新たに属性が追加され、スキャン内容をより正確に表現できています。

椅子オブジェクトの構造データ

5.オブジェクト類識別結果を構造データとして統合した3Dモデルのエクスポート

UUID Mapping

属性は他の新しい情報とともにエクスポート結果に含めることができます。エクスポートできるデータの種類には2つあります。

  • USDZ ノードからメタデータを検索するファイル

  • エクスポートされた USDZ をモデルで強化するための構造データ

ルームをメッシュとしてエクスポートする際には、サーフェスとオブジェクトのノードを含むUSDZが作成されます。ただし、これによってたたの3Dモデルとなってしまい、壁や物体の寸法だけでなく、物体の属性などの情報が失われてしまいます。

そこで、マッピングファイルを作成することで、エクスポート時に情報の損失を補完することができます。このマッピングファイルは、USDZ の一意のノード名と、識別子によって一意に識別される CapturedRoom 要素の間のブリッジを作成する、文字列から UUID へのエンコードされた辞書データです。

以前のバージョンでは、2つの方法で部屋データをエクスポートできました。

  • USDZとしてエクスポートする

  • JSONまたはPlistでエンコードされたCapturedRoom構造としてエクスポートする


iOS 17の新機能では、エクスポート機能で部屋をUSDZにマップするためのメタデータURLを指定することで、2つのエクスポート情報を関連付けることができます。これにより、スキャンした部屋をレンダリングする際に、表面やオブジェクトに関する追加情報をクエリすることができます。

ModelProvider

今回のアップデートにより、新しい構造であるModelProviderが利用可能になります。

ModelProviderは、カテゴリと属性セットをモデルのURLにマッピングします。オブジェクトに含まれるカテゴリと属性から、対応するモデルのURLをModelProviderから取得できます。

これを部屋全体に一般化すると、セクション、サーフェス、およびカテゴリと属性を持つオブジェクトのコレクションである部屋に対して、エクスポート関数で指定されたModelProviderインスタンスが3DモデルのURLを関連付けることができます。

このように構造化された部屋データをBlender等のソフトウェアに取り込むことで、非常に立地なコンテンツとして利用することが可能になりました。

Blenderで処理されたモデル

まとめ

今回のアップデートは、RoomPlanという革新的な機能がより使いやすく、より発展性のあるものになっています。

どちらかといえばマイナーアップデートに分類されるような内容ですが、開発者としては非常に価値のあるアップデートだと感じました。

また、Vision Proとの関係性も考えると、今後の空間を扱ったサービスを作る上でRoomPlanは非常に重要であると確認できました。

この記事が気に入ったらサポートをしてみませんか?