AntonMoss
Konstantin Magnus
Here is a version using SOPs.
This is cool! Fantastic use of copernicus sdf's and the trace sop. Time to study this wrangle.
Glad you like it. Here is a breakdown of the wrangle:
// PARAMETER
float speed = chf('speed');
//A multiplier float parameter to adjust the speed of the movement.
// UVW
int num = nuniqueval(0, 'prim', 'copynum');
// The total number of individual integer values of the copynum-attribute.
float u = i@copynum / (num - 1.0);
// Division of the copy number by the total number of copies, effectively creating a float ranging from 0.0 to 1.0 across all copies so each copy gets offset along the curve later.
v@Cd = set(u, 1.0 - u, 0.0);
// Visualization of u ranging from green to red.
// OFFSET
u = (u + @Time * speed) % 1.0;
// offsets u by the current time multiplied by speed. the modulo operator sets values above 1.0 back to its remainder. eg. 1.05 turns into 0.05
// CURVE ATTRIBUTES
vector uvw = set(u, 0.0, 0.0);
vector pos = primuv(1, 'P', 0, uvw);
vector nml = primuv(1, 'N', 0, uvw);
vector up = primuv(1, 'up', 0, uvw);
//The u float value becomes part of the vector uvw to look up position, normals, and up vectors from the curve on the second input.
// TRANSFORMATION
matrix xform = maketransform(up, nml, pos);
setpackedtransform(0, i@primnum, xform);
// Converting these three vectors into a transformation matrix that gets applied to the packed chain elements.