UE4で雨宿りする方法
ごあいさつ
ブログ始めました、ノトケケと申します。
普段はゲーム会社でUE4を使ってエフェクトアーティストとして働いています。
このブログでは、趣味のゲーム開発の進捗報告や、
作ったものの紹介をゆるくやっていきます。
本題
さて、現在日本は梅雨の季節です。
雨が好きな人はUE4でも雨を降らせてるんじゃないでしょうか。
ですが、UE4に限らずゲームエンジンの中の雨は何もしなかったら
屋根を貫通してしまいます。
なので今回は屋根で遮断される雨を作り、
UE4で雨宿りする方法についてです。
こんな感じに屋根がある場所では雨が降らないようにします。
マテリアルで雨が屋根の下に落ちないようにするテスト。分かりやすいように白くしてます。#ue4 #gamedev #screenshotsaturday #ゲーム制作 pic.twitter.com/ksje50h57J
— ノトケケ (@NOTOKEKE) 2020年7月4日
事前説明
ある程度UE4に慣れている人向けの記事です。
また、今回の記事はあくまで屋根で遮断させる方法なので
エフェクト自体の作り方は解説しません、ごめんなさい!
屋根で遮断させる方法としては以下の2つの方法があります。
- パーティクルにコリジョンを持たせる方法
- 屋根の高さの情報をテクスチャで用意しておき、パーティクルの高さと比較する方法
1は、雨粒一つ一つにコリジョンを持たせるのは負荷が高そうなので避けたいです。
GPUパーティクル用のコリジョンは負荷が低かったりしますが、SceneDepthを利用したものなのでカメラに映っていない雨は貫通します。DistanceFieldというものを使うと解決するらしいんですが、仕組みがよく分かってないので誰か教えて下さい。
今回は2の方法でやりました。UEのバージョンは4.24.2です。
解説
仕組みとしてはシャドウマップと大体一緒です。
シャドウマップってなんぞや?って方は調べてみると3Dゲームの
影の原理が分かって面白いと思います。
まずはじめに、高さ情報をテクスチャ化します。
UE4には、SceneCapture2Dというレベル上の物をキャプチャして、それをテクスチャ化出来るBPが用意されているのでそれを使います。
テクスチャの元となるRenderTargetを用意します。
SceneCapture2Dを用意します。
テクスチャに高さ情報を入れるので、
値を0~1に変換するためのポストプロセスマテリアルを作ります。
高さ情報が必要な座標に合わせてMinHeightとMaxHeightパラメータを変更します。
SceneCapture2Dのパラメータを変更します。
・ProjectionType 平行投影
・OrthoWidth キャプチャしたい範囲
・ポストプロセスマテリアル 作ったやつ
・TextureTarget 作ったやつ
・CaptureSorce FinalColor(FinalColorだとポストプロセスが反映される)
SceneCaptureをキャプチャしたい物より高く移動、回転のY軸に-90を入力して下に向けます。
各々の配置してるものによって形は変わって来ますが、こんなのがRenderTargetに表示されてると思います。RenderTargetは右クリックからスタティックテクスチャ化が出来るのでキャプチャし終えたら変換してください。
これで高さ情報は用意出来たので、RenderTargetを使用してエフェクトの
マテリアルの中に遮断処理を作っていきます。
注意点としては、MinHeighとMaxHeightには作ったポストプロセスマテリアルと同じ値を入れてください。
テクスチャはワールド座標のXY座標を利用して真上から投影されるようにします。
0~1に変換されたテクスチャの高さに戻し、ParticlePositionのZ座標を減算し、Saturateします。
これで屋根の下のマスクが取れるので、マスク部分だけワールドポジションオフセットですべての頂点をパーティクルの座標に移動させることで、屋根の下からはエフェクトが消えます。
真上から高さ情報をキャプチャしたのがミソで、それによって屋根の下の物は遮断され、屋根の下からテクスチャの高さとParticlePositionの値に差が生まれます。