Sign in to follow this  
Juliean

Particle parameter interpolation strategies

Recommended Posts

Juliean    7068

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?

 

Share this post


Link to post
Share on other sites
Bummel    1888

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));

Share this post


Link to post
Share on other sites
mk1x86    445

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.

Share this post


Link to post
Share on other sites
Juliean    7068

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.

Share this post


Link to post
Share on other sites
Jason Z    6434

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.

Share this post


Link to post
Share on other sites
Juliean    7068

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.

Share this post


Link to post
Share on other sites
mk1x86    445

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).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this