ポリラインの方向を視覚化する

ポリライン上に矢印を並べる。
Nとupベクトルを事前に設定しておく。カスタムpolyframe

//
// ポリラインの方向を視覚化する
// RunOver:Primitives
//
float step = 10.0; // 矢印の間隔
float scale = 1.0; // 矢印のスケール

// 色相
int numiterations = nprimitives(0);
float iteration = numiterations * random(@primnum);

float hue_range = 1.0;      // 0~1までの彩度幅
int sign = -1;              // 1か-1のグラデーションの向き
float hue_offset = 0.5;     // 色相の開始位置
float hue = (iteration / (float)numiterations) * hue_range * sign + hue_offset;
vector color = hsvtorgb(hue, 1, 1);
@Cd = color;

// 矢印を配置していく
float curveLength = primintrinsic(0, "measuredperimeter", @primnum);
float offset = 3.0 * scale / curveLength;

int num = int(curveLength / step);
for(int i = 0; i < num; i++)
{
    float u = (1.0 - offset) / float(num-1) * i;
    vector pos = primuv(0, "P", @primnum, set(u, 0));
    vector N = primuv(0, "N", @primnum, set(u, 0));
    vector up = primuv(0, "up", @primnum, set(u, 0));
    matrix world = maketransform(N, up, pos);

    int prim = addprim(0, "polyline");
    setprimattrib(0, "Cd", prim, hsvtorgb(hue, 1, 1));
    vector p0 = set(0, 0, 3.0) * scale * world;
    int pt0 = addpoint(0, p0);
    addvertex(0, prim, pt0);
    vector p1 = set(-1.0, 0, 0) * scale * world;
    int pt1 = addpoint(0, p1);
    addvertex(0, prim, pt1);
    vector p2 = set(1.0, 0, 0) * scale * world;
    int pt2 = addpoint(0, p2);
    addvertex(0, prim, pt2);
    addvertex(0, prim, pt0);
    vector p3 = set(0, 1.0, 0) * scale * world;
    int pt3 = addpoint(0, p3);
    addvertex(0, prim, pt3);
    vector p4 = set(0, -1.0, 0) * scale * world;
    int pt4 = addpoint(0, p4);
    addvertex(0, prim, pt4);
    addvertex(0, prim, pt0);
}
タイトルとURLをコピーしました