8
6

【UE5】傾斜フローマップをランタイムで計算する

Last updated at Posted at 2024-08-17

概要

マテリアルで傾斜ベクトルを計算し、テクスチャを使わずにフローマップによる流体表現を行います。
ランタイムで計算を行うので、様々な形状やアクタの回転にも対応できます。
fl1.gif
エンジンバージョンは5.4.3を使用しました。

実装

傾斜ベクトルの求め方

傾斜ベクトルの求め方はHoudiniのSOPノードLabs FlowmapにあるSlopeメソッドを参考にしました。
スクリーンショット 2024-08-17 185248.png
内部の処理を見ると、法線と下方向のベクトルの外積から従法線を出し、更に従法線と法線の外積で傾斜ベクトルを計算しています。
スクリーンショット 2024-08-17 185312.png
同じ処理をUEのマテリアルで再現すると以下のような感じになります。
スクリーンショット 2024-08-17 185047.png
Normalizeするかどうかはお好みで。
スクリーンショット 2024-08-17 190756.png
XYだけの値に見えますが、傾斜ベクトルは上を向くことがないのでZチャンネルにはマイナスの値が入っており、ちゃんとワールド空間のベクトルになっています。

Flow Map

マテリアルでは便利なFlow Map関数がいくつか用意されていますが、今回はFlowMaps_Simpleを使用します。
スクリーンショット 2024-08-17 193007.png
Diffuse、もしくはNormal MapインプットにFlow Mapで歪ませるテクスチャオブジェクトを刺します。
Flow Vector Mapには先ほど計算した傾斜ベクトルを入力するのですが、本来ここにはテクスチャのFlow Mapを入力するため、計算したベクトルをワールド空間からタンジェント空間に変換します。
Transformノードを挟み、ノードのDetailsからSourceをWorld Space、DestinationをTangent Spaceに設定します。
スクリーンショット 2024-08-17 195951.png
出力される値がRGBなのでMaskノードでRGに変換し、Gチャンネルが逆なので-1を乗算して反転させます。
スクリーンショット 2024-08-17 195754.png
UVのスケールやスピードの調整、ベクトルの大きさをお好みで調整するといい感じになります。
スクリーンショット 2024-08-17 200825.png

制限

  • メッシュの法線が正しい方向を向いていることが前提になります
  • 法線の再計算を行わないWorld Position Offset後は正確な傾斜を計算できません
  • タンジェント空間での計算なのでUVシームによってテクスチャの切れ目が発生します
    スクリーンショット 2024-08-17 202223.png
  • UVアイランド毎のスケールの違いなどによって流れる速度や見え方が変わります
    fl2.gif
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6