HoudiniでのUV制御方法 – How to control UVs in Houdini

HoudiniでのUV制御方法を紹介します!

目次

UVを0-1の範囲に収める
Normalize UVs to the 0–1 Range

比率を保ったまま、UVを0-1範囲にフィットさせます。

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

パラメータ
Translate.x0.5-$CEX
Translate.y0.5-$CEY
Scale.x1/$SIZEX
Scale.y1/$SIZEY
Pivot.x0.5
Pivot.y0.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を色々試すシチュエーションが多いので参考になれば幸いです!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次