あまり知られていないかもしれませんが、割と前からUE4、UE5には、Composite Plane(Beta)というプラグインがあります。
それを使うことでUE5内でもカメラマップ(カメラプロジェクション)ができます。
また、個人的にComposureを使わずに、手軽に静止画、動画とCGをUnreal Engine内で合成できないかと思っていました。
HDRI Backdropも便利なのですが、歪みなくスケールを合わせるのが難しい…
そこでカメラプロジェクションで影を落とせるようにすれば、それっぽくなると思いやってみました。
このやり方の問題点は、後ほど記載しますが、実際、色の扱いや合成の精度など、趣味レベルなので、あしからず!
サンプルプロジェクトはこちらからDLできます。
車は含まれておらず、HDRIとBackplateは、HDRI Haven からDLしたものになります。
ちなみにComposureでのバックプレートとの合成のやり方は、こちらで解説されています。
Composite Plane プラグイン と カメラプロジェクションについて
今回の方法は、Composite Planeプラグインをベースに改造しています。
なので、Composite Planetとカメラプロジェクションについて少しご紹介します。
Composite Planeプラグインを使うことで、↓のような感じにカメラプロジェクションができます。
簡易的なモデルを配置し、そこに画像、もしくは動画を投影するので、3D感がで、簡単なカメラアニメーションに対応できます。
↑の動画では、私がカメラプロジェクションに詳しいわけではなく、そこまでうまくない+簡単なテストだったので、そこまで複雑にモデルを作成していませんが、ちゃんとやるとこんな感じできたりします。
UE5では、モデリングツールがかなり進化しているので、カメラプロジェクションのモデルなら、UE5内でモデリングするのも可能かと思います。
動いても歪みのないようにするのは少し難しいですが(個人的に)、プラグインの使い方自体は、簡単です。
また、 Composite Plane プラグイン では、画像をキーイングしたり、動画をしたりすることもでき、割と多機能です。
ただ、こちらのプロジェクションのメッシュ上にデフォルトでは影が落とせない(はず…!)なので、アクターの影を落とせるようにします。
カメラプロジェクションにアクターの影を落とす
サンプルがあるので、ざっくりとした解説になりますが、やっていることはシンプルです。
Composite Planeプラグイン の画像の投影で使われるマテリアルは「Unlit」で基本的には影が落ちません。
ライティングの影響を受けず、影やオクリュージョンも乗らないので、メッシュの境目が目立たなくなるので、綺麗にプロジェクションができます。
メッシュのマテリアルをDefault Litすることで、影を落とすことができますが、今度は、ライティングを受け、オクリュージョンが乗ってしまい境目が目立つようになってしまいます。
そこでメッシュの境目や影を落とさない部分は
① Basecolor = 0, Emissive = Texture にして
影を落とす部分を
②Basecolor = Texture, Emissive = 0
にすることで、境目の目立たなくしつつ、部分的に影を落とします。
①と②もぱっきりわかれているとその際目が目立ってしまうので、グラデーションのマスクで①と②をブレンドします。
ブレンドするためのマスクは、色々な方法で作成できますが、今回は、単純にCircleMaskで円形のマスクを作成しています。
ちゃんとやるのであれば、頂点カラーなどでも良いと思いますし、SphereMaskの位置を自由に動かせるようにしたりすると良いと思います(SphereMaskのBに任意の座標を入れれるようにするなど)。
下記画像の赤の部分がその処理になります。
サンプルでは、「M_CamProj_Shadow」です。
青い部分は、マスクを視覚化するためのデバッグ表示と
影を落とさないメッシュ(IsGround=0)では、一応、マスク関係なくEmissive = Textureにするようにしています。
BP側で制御できるようにしたいのでSwitchを使っていません。
また、完全に影を落とさないメッシュ用にUnlitにしたマテリアルインスタンスも一応、用意しました(MI_CP_Shadow_Unlit)
実は、HDRI Backdropもやり方は少し違いますが、似たようなことをやって、半天球メッシュに影を落としています。
あとは、ブループリントアクター(BP_CineCameraProj)でこれらのパラメーターを調整できるようにします。
サンプルでは、個人的に使わない機能(ノード)は削除しているので、キーイングなど元のプラグインの機能で使いたいものがある場合は、プラグインの BP_CineCameraProj も参考にしてください。
サンプルの使い方
使い方は、Composite Planeとだいたい同じです。
① 画像を投影するメッシュを配置します。
カメラプロジェクションなので画像の形状に合わせるのが良いですが、ただ背景+地面として使うだけで、平らな地面に影を落とすだけであれば、L字や3面でも良いと思います。
スタティックメッシュのDetailsで「Cast Shadow」と「Affect Distance Field Shadow」のチェックを外し、これらのメッシュが影を落とさないようにします。
②BP_CineCameraProj の配置と設定
「Game/CameraProjectionwithShadow/BP_CineCameraProj」をレベルに配置します。
a: バックプレートの画像をセットします
b: 「Ground Object」で影を落とすメッシュ(地面)を指定します
c: 「Objects」でGround Object以外の影を落とさないメッシュを指定します
そうすると、Material Instance Dynamicがアサインされ、現在のカメラの位置から、メッシュに画像が投影されます。
③マスクを調整します
「IsDebugMask」にチェックをいれるマスクが表示されるので、マスクの範囲やグラデーションを「Radius」と「Hardness」で調整します。
あとは、Sky LightにHDRIを設定したり、適宜、ディレクショナルライトなどのライトを設定します。
ただ、影が落ちる部分は、ライティングの影響をうけるので、強さや色を調整して、馴染むようにする必要があります。
このやり方の問題点
このやり方のぱっと思いつく問題点としては、HDRI Backdropも同じなのですが
画像の上にもトーンマップがかかるので、元の画像と色味などが変わってしまいます。
露出などのポストプロセスの影響も受けます。
また、LumenのScreenTraceでの反射が入ってしまい、バックプレートの画像とHDRIの画像の両方の反射が部分的に映り込みます。
「r.Lumen.Reflections.ScreenTraces 0」でScreenTraceをなくすことはできますが、ケースバイケースで迷うところです。
まとめ
カメラマップを使いCGと画像を合成し、影を落とすという方法とサンプルをご紹介しました。
個人的にはComposureより軽くて、簡単で個人的に気に入っている方法ではありますが、趣味レベルでは良いですが、仕事レベルでは、どこまで精度を求めるか次第だなと思いました。
ただ、カメラマップなので、作り方次第で背景により立体感を持たせり、立体的に影を落としたり、少しカメラを動かしたりもできるかと思います。
なので、あまり役に立たないと思うので、紹介するか迷いましたが、せっかくなので、供養しようと思い、記事を作成してみました。
それでもどなたかの何らかのヒントなどになれば幸いです!