XZ平面を基準としたポリラインに対して、進行ベクトルNとアップベクトルupを設定する。前後のポイント座標差を進行ベクトルとしている。ポリラインが閉じている場合と開いている場合で場合分けしている。
//
// 前後のポイント座標差を進行ベクトルとする
// Run Over: Primitive
//
int pts[] = primpoints(0, @primnum);
// プリミティブが閉じているか否か
int isClosed = primintrinsic(0, "closed", 0);
for(int i = 0; i < len(pts); i++)
{
vector p0 = point(0, "P", pts[i-1]);
vector p1 = point(0, "P", pts[i+1]);
// 始点
if(i == 0)
{
if(isClosed)
p0 = point(0, "P", pts[-1]);
else
p0 = point(0, "P", pts[0]);
p1 = point(0, "P", pts[i+1]);
}
// 終点
else if(i == len(pts)-1)
{
p0 = point(0, "P", pts[i-1]);
if(isClosed)
p1 = point(0, "P", pts[0]);
else
p1 = point(0, "P", pts[i]);
}
vector n = normalize(p1 - p0);
vector up = set(0, 1, 0);
vector left = cross(up, n);
up = cross(n, left);
setpointattrib(0, "N", pts[i], n);
setpointattrib(0, "up", pts[i], up);
}
青が進行ベクトル、緑がアップベクトル。