HoudiniでのUV制御方法を紹介します!
目次
UVを0-1の範囲に収める
Normalize UVs to the 0–1 Range
比率を保ったまま、UVを0-1範囲にフィットさせます。

UV Transformノードを以下のようなエクスプレッション設定にすればOKです

| パラメータ | 値 |
|---|---|
| Translate.x | 0.5-$CEX |
| Translate.y | 0.5-$CEY |
| Scale.x | 1/$SIZEX |
| Scale.y | 1/$SIZEY |
| Pivot.x | 0.5 |
| Pivot.y | 0.5 |
比率ベースでRamp制御
Ramp Control Based on Ratio
格子状の場合、以下のようにすればRampで現在のUVを比率ベースで制御できます。

2つのAttribute Wrangleノードに、以下のVEXを貼り付けてください。

setdetailattrib(0, "u_min", @uv.x, "min");
setdetailattrib(0, "u_max", @uv.x, "max");
setdetailattrib(0, "v_min", @uv.y, "min");
setdetailattrib(0, "v_max", @uv.y, "max");
float ratio_x = fit(@uv.x, detail(0, "u_min"), detail(0, "u_max"), 0, 1);
float ratio_y = fit(@uv.y, detail(0, "v_min"), detail(0, "v_max"), 0, 1);
float u = chramp("u_ramp", ratio_x);
float v = chramp("v_ramp", ratio_y);
v@uv = set(u, v, 0);移動ベースでRamp制御
Offset-Based Ramp Control
格子状の場合、以下のようにすればRampで現在のUVをいどうベースで制御できます。

2つのAttribute Wrangleノードに、以下のVEXを貼り付けてください。

setdetailattrib(0, "u_min", @uv.x, "min");
setdetailattrib(0, "u_max", @uv.x, "max");
setdetailattrib(0, "v_min", @uv.y, "min");
setdetailattrib(0, "v_max", @uv.y, "max");
float ratio_u = fit(@uv.x,detail(0, "u_min"),detail(0, "u_max"),0,1);
float ratio_v = fit(@uv.y,detail(0, "v_min"),detail(0, "v_max"),0,1);
@uv.y += (fit01(chramp("V_Deform", ratio_u),-1,1) * chf("V_Deform_Scale"));
@uv.x += (fit01(chramp("U_Deform", ratio_v),-1,1) * chf("U_Deform_Scale"));ラティスっぽい変形をさせる
Lattice-Like Deformation Technique
ラティス変形のように、Rampカーブで形状を変形します。

2つのAttribute Wrangleノードに、以下のVEXを貼り付けてください。

setdetailattrib(0, "u_min", @uv.x, "min");
setdetailattrib(0, "u_max", @uv.x, "max");
setdetailattrib(0, "v_min", @uv.y, "min");
setdetailattrib(0, "v_max", @uv.y, "max");
float ratio_v = fit(@uv.y, detail(0, "v_min"), detail(0, "v_max"), 0, 1);
float ratio_u = fit(@uv.x, detail(0, "u_min"), detail(0, "u_max"), 0, 1);
float u_deform = chramp("scale_ramp_u", ratio_v) * chf("scale_u");
float v_deform = chramp("scale_ramp_v", ratio_u) * chf("scale_v");
vector2 piv = set(chf("pivot_u"), chf("pivot_v"));
vector2 uv = set(@uv.x, @uv.y);
vector2 s = set(u_deform, v_deform);
uv = (uv - piv) * s + piv;
@uv.x = uv.x;
@uv.y = uv.y;ノイズベースで変形
Noise-Based Deformation
U軸とV軸それぞれにノイズをかけます。
Noise Typeが「0」だと不規則な変形、「1」だと規則的な変形になります。

2つのAttribute Wrangleノードに、以下のVEXを貼り付けてください。

setdetailattrib(0, "u_min", @uv.x, "min");
setdetailattrib(0, "u_max", @uv.x, "max");
setdetailattrib(0, "v_min", @uv.y, "min");
setdetailattrib(0, "v_max", @uv.y, "max");
// ------------------- Noise関数 -------------------
// type 0 = 自然 (onoise)
// type 1 = 規則的 (sine)
float get_noise(float p; int type)
{
return (type == 0) ? onoise(p) : sin(p * M_PI * 2.0);
}
// ------------------------------------------------
int type = chi("Noise_Type");
float freq = chf("Frequency");
float offset = chf("Offset");
float ampU = chf("Amplitude_U");
float ampV = chf("Amplitude_V");
// uとvをRamp参照用に0-1正規化
float u01 = fit(@uv.x, detail(0,"u_min"), detail(0,"u_max"), 0.0, 1.0);
float v01 = fit(@uv.y, detail(0,"v_min"), detail(0,"v_max"), 0.0, 1.0);
// マスク
float u_mask = chramp("U_Noise", u01); // U方向変形の強さ分布
float v_mask = chramp("V_Noise", v01); // V方向変形の強さ分布
// 変形前のUVを保存
vector uv0 = v@uv;
// ---------- Uを歪ませる ----------
float sample_u = uv0.y * freq + offset;
@uv.x += get_noise(sample_u, type) * ampU * v_mask;
// ---------- Vを歪ませる ----------
float sample_v = uv0.x * freq + offset;
@uv.y += get_noise(sample_v, type) * ampV * u_mask;
さいごに
自分の備忘録も兼ねてまとめてみました。
エフェクト用のメッシュはシンプルなものが多い分、UVを色々試すシチュエーションが多いので参考になれば幸いです!


コメント