Primitiveに色をつける

//
// RunOver:Primitives
//
int numiterations = nprimitives(0);
int iteration = @primnum;
float range = 0.5; // 0~1までの彩度幅
int sign = -1; // 1か-1のグラデーションの向き
float offset = 0.5; // 彩度の開始位置
float hue = (iteration / (float)numiterations) * range * sign + offset;
@Cd = hsvtorgb(hue, 1, 1);
彩度によるグラデーションをプリミティブのインデックスに掛けている。
色の並びをランダムにする場合
//
// RunOver:Primitives
//
int numiterations = nprimitives(0);
float iteration = numiterations * random(@primnum);
float range = 0.5; // 0~1までの彩度幅
int sign = -1; // 1か-1のグラデーションの向き
float offset = 0.5; // 彩度の開始位置
float hue = (iteration / (float)numiterations) * range * sign + offset;
@Cd = hsvtorgb(hue, 1, 1);
ポリラインの方向を視覚化する

ポリライン上に矢印を並べる。
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);
}
プリミティブごとに高さを変える
重なってよく見えない時に高さを変えて確認する。
int pts[] = primpoints(0, @primnum);
for(int i = 0; i < len(pts); i++)
{
vector pos = point(0, "P", pts[i]);
pos.y += @primnum * 10;
setpointattrib(0, "P", pts[i], pos);
}
Named Primitiveに色をつける


For-Each Named Primitivesを使う。Block BeginノードからCreate Meta Import Nodeをつくる。

Block EndのPiece Attributeに変数名を入れる。
//
// RunOver: Primitives
//
int iteration = detail(1, "iteration");
int numiterations = detail(1, "numiterations");
float range = 0.5; // 0~1までの彩度幅
int sign = -1; // 1か-1のグラデーションの向き
float offset = 0.6; // 彩度の開始位置
float hue = (iteration / (float)numiterations) * range * sign + offset;
@Cd = hsvtorgb(hue, 1, 1);
Input1にMeta Import Nodeをつなげて、Iteration番号を利用する。
勾配の視覚化

// 最大勾配(%)
float maxSlople = 45;
vector N = normalize(@N);
vector up = set(0,1,0);
// 傾斜角
float angle = acos(dot(N, up));
// 勾配(%)へ変換
float slope = atan(angle)*100;
float range = 0.5; // 0~1までの彩度幅
int sign = -1; // 1か-1のグラデーションの向き
float offset = 0.5; // 彩度の開始位置
float hue = clamp(slope / maxSlople, 0, 1) * range * sign + offset;
@Cd = hsvtorgb(hue, 1, 1);
面法線Nとupの内積から角度を求める。上を向いている面が0°になり、絶壁が90°になる。