Sweep形状のUV

クロス側のポリライン

断面形状にuvが0~1までの範囲に収めるようにする。各ポイントに0~1にスケールした距離を記録する。

//
// UVのパラメトリック座標を計算する
// Run Over: Primitives
//
float curveLength = primintrinsic(0, "measuredperimeter", @primnum);

int pts[] = primpoints(0, @primnum);
float length[];
for(int i = 1; i < len(pts); i++)
{
    vector p0 = point(0, "P", pts[i-1]);
    vector p1 = point(0, "P", pts[i]);
    length[i] = length(p1 - p0);
}

float pos = 0;
for(int i = 0; i < len(pts); i++)
{
    pos += length[i];
    setpointattrib(0, "__u", pts[i], pos / curveLength);
}

バックボーン側のUV

UV Texture SOPを使ってuvアトリビュートをつくる。

// Run Over: Detail
f@__curveLength = primintrinsic(0, "measuredperimeter", 0);

Texture Type をArc Length Splineにする。Attribute ClassはPointに。
Scaleにarclen(0, 0, 0, 1)と入力。実距離がuvアトリビュートのx値に入る。ポリラインの長さで割ってスケールすれば、上のコードとやっていることは同じになる。

arclen(0, 0, 0, 1)

2つのポリラインをSweep SOPにつないで立体を生成した後、ポイントに残っているf@__uアトリビュートを使ってUVを整える。

// Run Over: Points
@uv.y = f@__u;

// 長さで割って0-1に合わせる
float width = detail(0, "__curveLength", 0);
@uv.x /= width;
タイトルとURLをコピーしました