Particle parameter interpolation strategies

Started by
5 comments, last by mk1x86 10 years, 11 months ago

Hello,

I want to implement interpolation for some of my particle parameters, for example color. Say I have these two values:


Color start(1.0f, 0.4, 0.0f);
Color end(0.2f, 0.2, 0.2f);

I want to interpolate between those two. For the effect I'm trying to achieve a linear interpolation isn't good enough. I want to play around with different interpolation.

What are common practices of doing so? I don't want to hardcode this, basically I want to have something like in some of those edtiors - a field where you have a function line from (0, 0) to (1,1). You can then deform this line by dragging. The x value would be the time between spawn and death), the y value would be the interpolation value (0 = start, 0.5 = halfway through start and end, 1.0 = end).

Not talking about the editor thingy itself, how would one implement such a thing, without hardcoding it? Do you have some pseudo-code or papers describing such a technique?

Advertisement

You could use a 1D lookup-texture. Just create a linear gradient in gimp/photoshop and use the curve tool to modify it the way you want it to look like.


float4 finalColor = lerp(startColor.rgba, targetColor.rgba, tex1D(GradientLUTSampler, lerpFactor));

Usually a third degree polynomial is sufficient. You can edit it by changing the tangents of the start and end point. Then there's (B-)splines obviously, but that requires a fair amount of calculation time. You can also take a look at Lagrange interpolation.

The best thing you can do is to write an editor that allows different interpolation types for pieces of your timeline.

You could use a 1D lookup-texture. Just create a linear gradient in gimp/photoshop and use the curve tool to modify it the way you want it to look like.

float4 finalColor = lerp(startColor.rgba, targetColor.rgba, tex1D(GradientLUTSampler, lerpFactor));

While I'm looking more for a solution that works inside the engine, this at least gave me a good hint on how to save CPU calculation time - storing the interpolation curve in an 1D texture and doing the lookup in the shader seems reasonable, thanks!

Usually a third degree polynomial is sufficient. You can edit it by changing the tangents of the start and end point. Then there's (B-)splines obviously, but that requires a fair amount of calculation time. You can also take a look at Lagrange interpolation.

Ah, polynomials, of course, how can I be so stupid :S One question though, how do I calculate a polynomial from a set of points and tangets? I slightly remember how it could go by points, but tangents? Not a clue...

The best thing you can do is to write an editor that allows different interpolation types for pieces of your timeline.

Yeah, particle editing integration in my editor is one of the first things I'm going to do as soon as everything is working. For testing purposes I'm fine with editing my XML-files per hand, but I'll agree, having an editor to change parameters conveniently ingame is really a charm.

What I think you are looking for is referred to as 'tweening' or 'easing' in animation lingo. The functions that you use are basically to calculate an interpolation factor to go between the start and end parameters. There are lots of different ways to do this, but usually some polynomial of nth degree is the easiest way to go for CPU based tweening. Take a look here for some examples.

Ah, now I know how this is called, makes further research much easier. The page looks very interesting, and since it has code examples its perfect for me to learn. Plus, since I'm using the texture lookup method, I can even have more complex tweening functions, as those are being calculated and stored in the texture only once at emitter creation.

Thanks again to all of you.

Ah, polynomials, of course, how can I be so stupid :S One question though, how do I calculate a polynomial from a set of points and tangets? I slightly remember how it could go by points, but tangents? Not a clue...

Well, given you have f(x) = ax3+bx2+cx+d you can start with your starting point and end point. Say you interpolate from 0 to 1 in a timespan from 0 to 1 (time is x) then for your starting point you know that a*0+b*0+c*0+d = 0. It follows that d = 0.

Same for the end point. For time x = 1 you know that a + b + c + d = 1

Now you can start using the tangents of your start and end point. For that you have to derive the polynomal, which results in g(x) = 3ax2+2bx+c

If you enter values for the start and end point you get two further equations. Now we have four equations and four unknown variables. All you need to do is add and subtract the equations from each other until you finally get all variables (if you're unfamiliar with it, take a look here).

This topic is closed to new replies.

Advertisement