クロス側のポリライン
断面形状に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;