先日、NVIDIAのFlexというのを知ってUE4で遊んでいました。
たのしい pic.twitter.com/5qqB7iLfcA
— Tonkotsu (@tonkotsu3656) 2017年4月18日
他にもHairWorksやVXGIなどなどあり、GitHubから落とせます。物理タノシイ
動画の中にあるバウンスボールと同じようなものをUE4のマテリアルで作れないかと思い、使ったのがDistanceToNearestSurfaceノードです。
ドキュメント : Unreal Engine | Utility の表現式
「Distance To Nearest Surface マテリアル表現式ノードは、マテリアルがレベルのどのポイントでも Global Distance Field のサンプリングができるようにします。」--- ドキュメント引用
各メッシュにはDistance Fieldという値が設定されていて、このノードはメッシュの各ポイントの近くにあるメッシュのDistance Fieldの値を取ってきてくれます。
各メッシュでDistance Fieldの解像度スケールが決められています。
ViewportのShow Flagsで可視化することができます。
作ってみる
はじめに"Project Settings → Rendering → Generate Mesh Distance Field"を有効にし、エディタを再起動させます。次回エディタロード時にDistance Fieldがバックグラウンドで作成されます。
有効にしないとDistance Fieldを使うノードから常に0が返ってきます。
マテリアルを作成します。
下記のフォーラムを参考にしました。(ほぼ一緒)
Distance Fieldに法線情報を乗算してテッセレーションを使ってメッシュの形を変えています。
World DisplacementとTessellation MultiplierはテッセレーションモードをFlat TessellationかPN Trianglesにすることで有効になります。
こんな感じです。ヤッター!
フォーラムのマテリアル式を参考にすればすぐ実装はできますが、パラメータの調整が難しかったり汎用的に使うにはまだ処理が雑な部分(特に法線情報だけで処理していたり)があるので少し工夫が必要そうです。
フォーラムには他にもスライムみたいなものを作っていたり、メッシュが近くにあると透過したりする例もありました。
UE Version : 4.15