Unity ARFoundation6での手振れ補正!!

この記事は、 KENTEM TechBlog アドベントカレンダー2024 24日目、12月24日の記事です。

開発部エンジニアのY.A.です。
10月にGAされたUnity6×ARFoundation6で手振れ補正対応してみた話です。

環境

  • Windows11 pro
  • Unity Hub 3.10.00
  • Unity 6000.0.31f1(日本語)
  • Android端末 : Pixel8 (Android15)

はじめに

今回の記事は、Google I/O 2023で発表された電子手振れ補正機能(Electronic Image Stabilization)がUnityで実現可能になったためその実装の検証です。
上記機能が発表されたのが2023年5月でしたので、Unity環境で正式使用できるまで1年半ほどかかってしまいました。個人的にはとても期待していた機能ですので早速試してみます。

手振れ補正を使用するには

前提として、手振れ補正がUnity AR Foundationのバージョン6(以下ARFoundation6)から正式使用可能になっています。 ARFoundation6は動作要件として10月に正式リリースされたUnity6が必須です。 そのため、Unity6の正式リリースのタイミングが正式リリースとなっています。 公式のドキュメントでも、ARFoundation6以降でImage Stabilizationが追加されていますね。 - AR Foundation 6のカメラコンポーネント - AR Foundation 5.1のカメラコンポーネント

対応手順

対応までは簡単で以下の2ステップのみです。 既存でARFoundation5環境を使用している方はARFoundation6にアップグレードする必要があります。

  1. Unity6でARFoundation6環境を作成する
  2. AR Camera ManagerのImageStabilizationフラグをtrueにする

今回は、Unity6+ARFoundation6環境をAR Mobileのテンプレートを使用して行いますので「1.」は簡易的に実施していきます。

Unity6でARFoundation6環境を作成する

UnityHubのテンプレートでプロジェクトを作成していきます。

  1. UnityHubで最新のUnity6をインストールします。
    ARFoundationを使用するため、Android(必要な方はiOS)にチェックを入れてください。
  2. 「AR Mobile」のテンプレートを選択し新規プロジェクトを作成します。
  3. プロジェクトが起動できたら「Window > Package Manager」を起動しAR関連のパッケージがVer6以上になっていることを確認します。

これで環境作成は完了です。
Unity6のARテンプレートはデフォルトでARFoundation6を参照してくれています!
とても便利ですね。
余談ですが、グラフィックスの設定もデフォルトでURPになっていました。
今までは自分で設定変えていたのでとてもうれしい変更です!

AR Camera ManagerのImageStabilizationフラグをtrueにする

環境は整いましたのでフラグ変更を行います。
変更するフラグは「SampleScene > XR Origin(AR Rig) > Camera Offset >Main Camera」のARCameraManagerコンポーネントにあります。
デフォルトではチェックが入っていません。

チェックを入れて実機で実行し確認してみましょう。
手振れ補正が効いていることが確認できます。
ただ、これだけだと効果の比較がしにくいですね。

スクリプトから設定を変更する

対応自体はできたので、実行中に設定変更をするようにしていきます。
既存のデバッグメニューに加えて「Image Stabilization」のスイッチを配置しています。
今回はVisualizeSurfacesのスイッチをコピーしてそのまま配置し、アイコン等だけ変更しています!
切り替えるだけなので、ボタンでもなんでも大丈夫です。

  • SampleScene > UI」にあるARTemplateMenuManagerコンポーネントに、ARCameraManagerを受け取れるフィールドを作成します。
[SerializeField]
private ARCameraManager _cameraManager;
  • ARTemplateMenuManagerに切り替え用のメソッドを作成します。
/// <summary>Image Stabilizationの切替</summary>
public void SwitchEnableImageStabilization(ARCameraManager cameraManager)
{
    //手振れ補正対応しているか確認
    bool isSupport = cameraManager.subsystem.subsystemDescriptor.supportsImageStabilization ==
        Supported.Supported;
    if (isSupport)
    {
        //現在の状態をチェックしてimageStabilizationRequestedを更新
        if (cameraManager.imageStabilizationEnabled)
            cameraManager.imageStabilizationRequested = false;
        else
            cameraManager.imageStabilizationRequested = true;
    }
}
  • UIから呼び出す用のメソッドを用意します。 ※今回はスライダーでスイッチを再現するためDebugSlider _imageStabilizationSliderを受け取っています。実装環境に合わせて好きなもので対応してください!
/// <summary>Image Stabilizationの切替</summary>
public void SwitchEnableImageStabilization()
{
    SwitchEnableImageStabilization(_cameraManager);
    //UIの更新
    if (_cameraManager.imageStabilizationRequested)
        _imageStabilizationSlider.value = 1;
    else
        _imageStabilizationSlider.value = 0;
}
  • 最後にクリック時のイベントに先ほど作成したメソッドを登録します。

これで、切り替えロジックは作成完了です。

動作確認

いい感じですね。
実物を手で持った感覚では、もっと補正されている感があります!

補正前 補正後
補正前
補正後

また、手振れ補正をONにすると画角が狭くなっているのが分かります。 この余白部分でぶれを補正していると思われます。

切り替え時

まとめ

今回は、ARのテンプレートを使って手振れ補正の確認をしてみました。 Androidではかなり効果があり、ARのアプリの動画を撮影してもかなり印象が変わります。 残念ながらiOSでは対応していませんが、今後ARKitにも同様の機能がついて同じフラグで制御できるといいなと感じました! 今後の更新に期待です!

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
recruit.kentem.jp career.kentem.jp