オブジェクト固有のローカルなグラデーションマスクを作る【Material】
World positionとは?
World座標における、各ポイントの座標。
Object positionとは?
World座標におけるオブジェクトのピボットの座標を表す。
World position – Object positionをするとLocal positionになる?
動いた分が相殺されて、オブジェクトのピボット位置から見て、そのポイントはどの位置にあるかがわかる。
(10,2,0)-(10,0,0)=(0,2,0)
(5,6,2)-(5,8,2)=(0,-2,0)
⚠️単純に引き算をしただけの場合、この値はまだワールド空間の向き(軸)を維持している。どれだけ回転やスケールをしてもプラス方向は変わらないので、オブジェクトが回転、拡大縮小させたいなら、回転行列をかけるか、標準のtransform position (World to Local)ノードを使用する。(引き算だけの方がそりゃ軽い)
さらに Object boundsでDivideすると?
オブジェクトの大きさ(スケール)が変わっても自動追従させたいときによく使われます。
ローカルな高さグラデーション: キャラクターやプロップの足元だけを暗くしたい、または上から雪を降らせるマスクを作りたいとき。
ディゾルブ(消滅)エフェクト: オブジェクトの端から中心に向かって徐々に消えていくようなエフェクト。
テクスチャのローカル投影: UV展開がされていない・あるいは壊れているスタティックメッシュに対して、簡易的に3Dテクスチャを綺麗にマッピングしたいとき。
Object Boundsは中心(ピボット位置ではなく、バウンディングボックスの中心)から各軸の端までの距離、つまり半径/Extendを返します。
ローカル座標をこのサイズで割ることで、数値を -0.5 ~ 0.5の範囲に正規化(ノーマライズ)しています。もしこれを 0~1の使いやすい範囲に補正したい場合は、この結果に + 0.5 をします。
最終的にオブジェクトの中心を 0 としたとき、端にいくにつれて数値が以下のように変化するグラデーション(座標データ)が手に入ります。
オブジェクトのマイナス側の端: -0.5
オブジェクトの中心点: 0
オブジェクトのプラス側の端: 0.5
ここで気づいてしまった!
A/Bをすると、Bを基準にAが正規化されるということを!(ほかの計算でも共通かも。。。)
TransformPosition (World to Local)ノードと数式(World – Object / Bounds)の違いは?
1. TransformPosition (World to Local) の挙動
このノードは、純粋に「DCCツール(MayaやZBrushなど)で設定したローカル座標系」へと空間を変換します。
- 原点((0,0,0) になる場所): ピボット位置
- 数値の単位: センチメートル(UEのユニット単位)
- 例えば、ピボットからX軸方向に100cm離れた頂点は、メッシュのサイズに関係なく常に
(100, 0, 0)になります。
- 例えば、ピボットからX軸方向に100cm離れた頂点は、メッシュのサイズに関係なく常に
2. 数式(World – Object / Bounds)の挙動
一方で、引き算してバウンディングボックスのサイズで割る手法は、「オブジェクトの大きさを基準にした割合(0〜1)の空間」を作ります。
- 原点(0 になる場所): 引き算するノード(
Object Positionならピボット、Object Bounds [Center]なら幾何学中心)。 - 数値の単位: 割合(-0.5~0.5、または0~1)
- メッシュの実際の大きさが100cmだろうが10mだろうが、オブジェクトの端っこは常に
0.5(または1.0)になります。
- メッシュの実際の大きさが100cmだろうが10mだろうが、オブジェクトの端っこは常に
どう使い分ける?
💡 TransformPosition を使うべきケース
「絶対的なサイズ(センチメートル)」で制御したいときに使います。
- 例:水面や泥のウェットネス(濡れ)表現
- 「地面(ピボット)から高さ30cmの範囲だけを常に濡らしたい」という場合、アセットの大きさが変わっても「30cm」という絶対値は変えたくないため、実寸を返してくれる
TransformPositionが最適です。
- 「地面(ピボット)から高さ30cmの範囲だけを常に濡らしたい」という場合、アセットの大きさが変わっても「30cm」という絶対値は変えたくないため、実寸を返してくれる
- 例:トライプラナーマッピング(世界軸投影テクスチャ)
- テクスチャの解像度(タイリング)をメッシュのスケールに依存させず、1m四方で固定したいとき。
💡 数式(World – Object / Bounds)を使うべきケース
「オブジェクトの見た目の割合(パーセンテージ)」で制御したいときに使います。
- 例:グラデーションマスクやSF的なディゾルブエフェクト
- 「ビルのアセットでも、小さな箱でも、常に全体の底から天井に向かって綺麗に 0~1 で消滅させたい」という場合。実寸(cm)で計算すると、大きなビルは途中で消滅が止まってしまいますが、割合ならどんなサイズのアセットにも一発で馴染みます。
どういう場合に使うの?
どちらも、3Dモデルに対して「テクスチャのUV展開に頼らず、モデルの形状(上下・左右・前後)を基準にしてブレンドやエフェクトをかけたいとき」のマスクとして使われます。
- 「上を向いている面」ではなく「アセットの上側」にだけ何かしたい(例:ビルの上層階だけ光らせる、プロップのてっぺんにだけ死の灰や雪のマスクを乗せる)
- アセットの境界部分からじわっと変化させたい(例:SF的なシールドのエネルギー表現、オブジェクトが消滅する際のスライス・ディゾルブマスク)
- 特定の高さだけ変化させたい(例:どんな大きさの岩でも、地面から30cmの高さまで泥の汚れマスクを塗る)
UVのレイアウトやメッシュのスケールに縛られず、「このアセットの、この高さ・この範囲」というマスクを数学的に、かつ動的に作り出すためのベースとなる処理です。
