バックボーンカーブをつくる
進行方向のベクトルを@Nに、アップベクトルを@upに格納したポリラインを用意する。
真っ直ぐにジオメトリをつくる
ポリラインと同じ長さでZ軸方向に伸ばしたメッシュを用意する。
これをポリラインにフィットさせる。
法線を変換する
はじめに法線ベクトルをポリラインに沿って変換する。
//
// 法線ベクトルをポリラインの空間に合わせて変換する
// RunOver: Vertices
// input1: Polyline
//
float curveLength = primintrinsic(1, "measuredperimeter", 0);
// 実際の長さで割る
float dist = @P.z / curveLength;
vector2 posuv = set(dist, 0);
// 実際のカーブ上の座標
vector curvepos = primuv(1, "P", 0, posuv);
// 行列計算
vector N = primuv(1, "N", 0, posuv);
vector up = primuv(1, "up", 0, posuv);
matrix m = maketransform(N, up);
@N *= m;
座標を変換する
つぎに、座標を変換する。
//
// ポイント座標をポリラインの空間に合わせて変換する
// RunOver: Points
// input1: Polyline
//
float curveLength = primintrinsic(1, "measuredperimeter", 0);
// 実際の長さで割る
float dist = @P.z / curveLength;
//dist %= 1;
vector2 posuv = set(dist, 0);
// 実際のカーブ上の座標
vector curvepos = primuv(1, "P", 0, posuv);
// 行列計算
vector N = primuv(1, "N", 0, posuv);
vector up = primuv(1, "up", 0, posuv);
matrix m = maketransform(N, up, curvepos);
@P.z = 0.0;
@P *= m;