【CG】テクスチャをオブジェクトスケール等を無視して、UV値のみに依存させる【UE4】
たぶん建築ビジュアライゼーションだけ手がけていらっしゃる方にとっては「なにそれ? そんな考慮要る?」って話題かもしれませんが、CAD屋さんにとっては重要(?)な話だったりします。という件の実装方法の例です。
例えば、以下のようなブロックのテクスチャがあったとします。このとき、
「ブロックのサイズは幅30cm×高さ10cmなので、CADやCG上でもそのサイズで表現されるようにしといて。」
という注文が普通にあります。あるはず。
通常のUE4の使い方だとそんなのどうやって設定すんねん、目測でやれってか!? っていう話になります。
このように、ビジュアライゼーションだったら見栄えがそれなりであればOKなのかもしれません(?)が、CAD等ではそうもいきません。30cm×10cmのブロックで施工する予定であれば、CGの世界でも30cmで表現してもらわないと困るわけです。
建設会社vs施主のトラブルの元であり、(訴訟問題まで発展することはさすがに聞きませんが、)顧客満足度的な部分が微妙に落ちる可能性はなくもないです。
うそだろフォトリアルだったらそれでいいじゃん―なんて思うでしょうが、これらは実際にある話しです。
話を本題に戻しましょう、
1枚のテクスチャが実世界のスケールで何cmかどうかを
UE4公式ドキュメントには「Absolute World Positionノードを使おう」ってのは載っていますが、これはXY平面にしか効かないので(?)、あまり有効ではない手法です。
ではでは、UE4でもオブジェクトのスケールに依存せずに自分が決めたUV値だけに従うマテリアル設定をしてみましょう。
やってみよう
ブループリントで完結します。UE4フォーラムなんかでも似たような質問の解決策としてAbsolute World Positionを使っていますが、今回の実装方法でもAbsolute World Positionを使用します。それに加えてパラメータを追加して使いやすくしよう。という感じで進めていきましょう。
サンプルとして以下のような赤レンガの外壁を使ってみます。
Absolute World Positionで設定する
Absolute World Positionノードを使うことで実現できます。
例えば、Absolute World PositionノードにMaskノードを接続して、R、G(つまりX、Y軸の値)をONにして、さらに100で割る(100cm=1UV単位に変換)ことで、Z軸方向の面(上向きの面)においては、オブジェクトがどんな状況にあっても100cmあたり1UVになります。
この方法はよく紹介されているのですが1つ弱点があります。真上を向く面にしか適用できません。建物で言うならば、床と天井はうまくいきますが、壁や屋根が上手くいきません。
そこで、どの方向にも絶対座標が有効になるようなマテリアル関数を作ります。
完成
いかがでしょうか。
ただし1点注意があって、斜め方向だとずれます。最大でななめ45度のときに√2(=1.414)だけずれるみたいです。