Polylineに沿ったメッシュの座標変換

進行方向のベクトルを@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;
タイトルとURLをコピーしました