ARKitでAR表示を実装してみて分かったこと

学習記録

カスタムURLスキームでのアプリ間連携を実装した後、次はカメラ越しに3Dオブジェクトを配置できるAR機能を作りたくなり、ARKitに挑戦しました。

1. 平面を自動で検出してくれると思い込んでいた

最初、ARKitを組み込みさえすれば、床やテーブルのような平面を自動的に認識してオブジェクトを置けるようになるものだと思い込んでいました。

configuration.planeDetection = [.horizontal]

実際にはARWorldTrackingConfigurationのplaneDetectionプロパティで、検出したい平面の種類(水平・垂直)を明示的に指定する必要がありました。何も設定しなければ平面検出自体が行われず、オブジェクトを置く土台がいつまでも見つからない状態になってしまいます。

2. 検出直後にオブジェクトを配置しようとして失敗した

平面検出の通知を受け取った直後に3Dオブジェクトを配置する処理を書いていたのですが、配置したオブジェクトが不安定に揺れ動いたり、位置がずれたりする不具合が頻発しました。

発生した問題:
検出直後の平面はまだ範囲や位置の推定precisionが低い

ARKitの平面検出は最初に検出された瞬間はまだ推定の精度が粗く、少し時間が経って複数フレーム分の情報が蓄積されることで安定していきます。検出直後ではなく、ある程度平面の範囲が安定してからオブジェクトを配置するよう調整し、揺れや位置ズレを軽減しました。

3. 光源の向きを合わせずに違和感のある見た目になっていた

3Dオブジェクトの表示自体はできたのですが、周囲の実際の照明環境とオブジェクトの陰影が合わず、いかにも「貼り付けた」ような不自然な見た目になっていました。

configuration.environmentTexturing = .automatic

ARKitには周囲の環境光を推定してオブジェクトのレンダリングに反映する仕組みがあり、これを有効にしていなかったことが原因でした。環境テクスチャリングを有効にしたことで、オブジェクトの陰影が周囲の光環境になじみ、違和感がかなり和らぎました。

4. シミュレータでの動作確認に時間を使ってしまった

実装の初期段階で、シミュレータ上でARKitの動作確認をしようとしてうまくいかず、原因を探すのに時間を使ってしまいました。

シミュレータの制約:
カメラを使った実際の空間認識は再現できない

調べてみるとARKitの中心的な機能はカメラ映像とセンサー情報を使った実空間の認識が前提のため、そもそもシミュレータでは正しく動作を確認できない仕組みでした。AR機能の実装は最初から実機を用意して進めるべきだったと反省しました。

まとめ

  • 平面検出は自動ではなく、planeDetectionで検出したい種類を明示的に指定する
  • 検出直後の平面はまだ不安定。オブジェクト配置は少し安定するのを待ってから行う
  • 環境テクスチャリングを有効にすると、オブジェクトの陰影が周囲の光環境になじみ違和感が減る
  • ARKitの動作確認はシミュレータでは行えない。最初から実機で進める

画面に3Dオブジェクトが浮かぶ体験は魅力的でしたが、自然に見せるための細かい調整に地道な試行錯誤が必要な実装でした。

次は、Visionフレームワークでのテキスト認識について分かったことをまとめます。


本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。

コメント

タイトルとURLをコピーしました