Jump to content

  • Log In with Google      Sign In   
  • Create Account


Particle parameter interpolation strategies


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 Juliean   GDNet+   -  Reputation: 2206

Like
0Likes
Like

Posted 25 April 2013 - 05:21 AM

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?

 



Sponsor:

#2 Tasty Texel   Members   -  Reputation: 1176

Like
1Likes
Like

Posted 25 April 2013 - 08:09 AM

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


#3 mk1x86   Members   -  Reputation: 442

Like
1Likes
Like

Posted 25 April 2013 - 08:16 AM

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.



#4 Juliean   GDNet+   -  Reputation: 2206

Like
0Likes
Like

Posted 25 April 2013 - 09:25 AM

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.



#5 Jason Z   Crossbones+   -  Reputation: 4561

Like
2Likes
Like

Posted 25 April 2013 - 04:13 PM

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.



#6 Juliean   GDNet+   -  Reputation: 2206

Like
0Likes
Like

Posted 25 April 2013 - 05:43 PM

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.



#7 mk1x86   Members   -  Reputation: 442

Like
0Likes
Like

Posted 26 April 2013 - 02:55 AM

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






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS