*Create a simple default PFlow (add a Cache if you want to speed things up)
*Create a Box primitive
*Clone the Box 100 times
*Main Menu > MAXScript > New Script
Paste the following code into the new script editor:
theSystem = $PF_Source_01 --this is the default PFlow source
theArray = $Box* as array --this is the array of boxes you created
for t = animationRange.start to animationRange.end do --loop through animation segment
sliderTime = t --set the slider time to the time value
theCount = theSystem.numParticles() --get the number of particles in the whole flow
for p = 1 to theCount do --loop through all the particles
theSystem.particleIndex = p --set the p-th particle as active
if p <= theArray.count do --if the particle index is less than the number of boxes,
with animate on theArray[p].transform = theSystem.particleTM --set the transformation of the p-th box to the matrix of the p-th particle
)--end p loop
)--end t loop
*Press Ctrl+E and watch the boxes following the particles.
Then you can delete the PFlow and the boxes will still be animated and exportable.
There is a small caveat - the initial position of the boxes will also get animated to their first particle-defined position. As new particles are born, new boxes will move to the location the particle is born.
If the animation is created with a constant number of particles born on frame 0, this would not be an issue. Otherwise, the script would require the visibility of the boxes to also be animated to hide this additional motion…
But I hope you get the idea…