Something I keep re-solving badly, and I would like to know what people here settle on.
If an emitter is moving fast and you spawn N particles per frame at the emitter's current position, you get visible clumps: one blob per frame, spaced by however far the emitter travelled between frames. It reads as chunky at 30fps and gets worse the faster the emitter moves. Sparks trailing a projectile is the obvious case.
The fix most people eventually find is to spread the frame's emissions along the segment the emitter actually travelled, instead of putting them all at the current position. Roughly: for each of the n particles due this frame, pick a fraction s along the segment, lerp between prevPos and pos by s to get the spawn point, and give that particle a starting age of (1 - s) * dt.
That last part is the one I always forget. If you distribute the positions along the segment but give every particle age zero, you have fixed the spacing and broken the timing: they all still begin their lifetime curves on the same frame boundary, so the head of the trail pops. Pre-ageing each particle by the remaining fraction of the frame is what actually makes it read as continuous.
Three things I do not have good answers for.
First, do you interpolate emitter rotation and velocity across the segment as well, or is position alone enough in practice? I have only ever done position.
Second, on a curved path a straight lerp across the frame is visibly wrong at high speed. Is a hermite using the previous velocity worth the complexity, or do you just clamp dt and move on?
Third, does anyone do this GPU-side, or is spawn always CPU-side in your engines?
For context, I work on a browser-based particle editor, so I am trying to get this right once in a runtime rather than per-game, which is why I care about the general case more than any specific engine's answer.
If it helps, here is the lifetime-curve half in isolation as a small canvas demo: https://codepen.io/SonaArajyan03/details/xbqGxVm and the runtime notes are at https://nixiefx.com/threejs-runtime/ (disclosure: that one is mine).
Mostly curious whether sub-frame emission is something people bother with in 2D at all, or whether it stays a high-speed 3D concern.
