2022/5/2エンジニア

     【UE4】AR開発で影を表示する方法について模索した話

    執筆者 /M.M

    はじめに

    AR開発をした際に影周りに関して調査していました。どうやら影を表現する方法が複数あることがわかりましたので、この記事ではその調べた内容を記載していきます。

    用意するもの

    ・Unreal Engine 4.26

    ・Visual Studio 2017

    ・スマホ端末(この記事ではAndroidを使用)

    準備

    基本的にARにて空間上に影を表示するには、スマホカメラから取得したテクスチャを床のマテリアルに投影し、疑似的に透明にさせて影を落とすようにします。

    そこで今回は以下のようなマテリアルを用意し、あたかも空間上に影が出るよう設定していきます。

    ちなみにこのマテリアルはUE4のバージョン4.25以前だとバグで正しく表示できません。

    こちらを行う際は4.26以降で確認してください。

    その1. 通常シャドウ

    通常シャドウを表示するには、先ほどのマテリアルを以下のように設定する必要があります。

    ・ShadingModelをDefaultLit

    ・最終Outputをベースカラー

    マップに配置している指向性ライトも以下のように設定してください。

    ・可動性をムーバブル

    作成したマテリアルを床に適応させ、モデルと同時に出現させてみます。

    影が薄すぎて見えない可能性があったため、完全な白い床でも確認してみました。

    Androidの実機の問題なのかわかりませんがどうやら影が落ちないようです。

    ちなみにこの方法の場合、床のマテリアルがライティングを有効にしているためか、指向性ライトが反射して透明にならなくなってしまいます。

    その2. カスケードシャドウ

    通常シャドウと同様のマテリアルを使用します。

    配置している指向性ライトは以下のように変更します。

    ・CastShadowをオフ

    ・DynamicShadowDistanceStationaryLightを0以上の値

    ・InsetShadowsForMovableObjectsをオフ

    ・可動性をステーショナリー

    ・CastModuatedShadowをオン

    通常シャドウと比較すると、しっかり影が落ちていることがわかります。

    床がライティング有効のため透明にできないですし、指向性ライトも動的に変更できないのはデメリットのようです。

    その3. 変調シャドウ

    変調シャドウはライティング無効のマテリアル上でも影を落とすことができます。

    そこで床のマテリアルを以下のように修正しました。

    ・ShadingModelをUnitに変更

    ・最終Outputをエミッシブカラーに変更

    マップに配置している指向性ライトも以下のように設定してください。

    ・可動性をステーショナリー

    ・CastModuatedShadowをオン

    床を透明にすることもでき、影の色もしっかりと表示されました。

    また、調べたところ変調シャドウは他にも自身の落ち影の有無を設定できたり、影の色を変更できたりとカスタマイズ性が豊富のようです。

    その4. 丸影

    新規プロジェクトを作った際に「携帯AR」を選択しておくと、「M_ContactShadow」があるので、丸影はこれを使いました。使い方は同フォルダにある「BP_Placeable」を参考にしてます。

    他と比較すると、モデルの形から作られている影ではないため、動きがあると違和感が出ると思われます。しかし、影を落とすための床が必要ない点やそのためのマテリアルを必要としないところは、実装が簡易的になるというメリットになりそうです。

    その5. SceneCapture

    SceneCaptureでモデルの形をマテリアルに投影させ、疑似的に影を作る手法です。投影する際は撮影したデータのアルファ値から算出して出力します。

    まず、SceneCapture用のテクスチャを用意します。

    次にこのテクスチャのA値を利用して、無理やりモデルの形から影っぽいマテリアルを生成します。

    最後にSceneCaptureと作成したマテリアルを反映した床をいい感じの位置に配置します。この時点でいい感じのものができていることがわかります。

    これを端末で表示してみます。

    だいぶいい感じの影が出力できたのではないでしょうか。

    まとめ

    上記の内容のメリットデメリットを以下にまとめます。

    メリットデメリット
    通常シャドウ・実装が容易・任意の方向に影を落とすことが可能・影の形がいびつになる・指向性ライトの強さで影の見えやすさが変わる・床を完全透明にすることができない・端末によっては表示できない可能性がある
    カスケードシャドウ・モデルの形通りに影を落とすことができる。・ビルド後はライトの傾きを変更できない
    ・床を完全透明にすることができない
    ・指向性ライトの強さで影の見えやすさが変わる
    変調シャドウ・床が透明でもできる・影がくっきり見える・落ち影の設定が可能・ビルド後はライトの傾きを変更できない。
    丸影・実装が容易
    ・影を落とす床を配置する必要がない・処理が軽く、動作が安定
    ・動きのあるモデルに対応できない・他の影と比較すると影っぽくない
    SceneCapture・影がくっきり見える・任意の方向に影を落とすことが可能
    ・影を落とす床を配置する必要がない
    ・実装の難易度が高い・負荷がかかる可能性がある
    ・モデルによっては正しくキャプチャされず、影がうまく表示されない可能性がある。

    どのようなARアプリを開発するかによって使い分けることができるのではと感じました。個人的には影を重要視しないなら丸影でもいいですし、影を綺麗に表示させるだけなら変調シャドウがいいのかなと思います。

    参考記事リンク