This page explains the algorithm behind grid based wave simulations.
Think of a 1-d wave like this:
now the main idea is that a wave can be approximated by a row of individual points, which can just move up and downwards. seen together they will form the wave.
each point can move up- and downwards.
but after what mechanism?
this also not too difficult.
every point has a position in y and a velocity with which it is moving up and downwards. positive velocities mean the point is moving upwards, negative downwards.
in each frame a new position is calculated by adding the velocity:
p = p_lastframe + v
now also the velocity is calculated after newtons idea. the velocity of the point can be altered by adding acceleration:
v = v_lastframe + a
so this is just the basic newton model of moving particles in space. and at the moment the points don't influence each other. they are just prepared to be accelerated up- or downwards.
the second step will be to calculate the acceleration of each point.
the idea is that every point is connected to the neighbour points by springs:
and this is the amazing part: every point is just being pushed around by its neighbour via these strings. with this mechanism energy (like one oscillating point) will be transfered through the whole string system of connected points.
each point just tends to move into the middle of its neighbours so that both springs (to the left and to the right of each point) are perfectly relaxed.
it depends on the strength of the strings (and of the mass of each point) in what amount this force on each particle will influence its acceleration.
delta_p = (p_left - p) + (p_right - p)
= p_left + p_right - 2*p
a = attack * delta_p
attack is just a global variable which decides how jittery the system is.
v = (v_lastframe + a) * slowdown
if a value for slowdown like 0.99 is chosen a point will loose 1% of its energy in each frame. (also try 0.999)
p = p_lastframe + v
v = (v_lastframe + a) * slowdown
=>
p = p_lastframe + (v_lastframe + a) * slowdown
a = attack * delta_p
delta_p = p_left + p_right - 2*p
delta_p is also computed with values of the last frame.
p_left means p_left_lastframe ... p means p_lastframe
=>
a = attack * (p_left + p_right - 2*p_lastframe)
p = p_lastframe + (v_lastframe + a) * slowdown
a = attack * (p_left + p_right - 2*p)
=>
p = p_lastframe + (v_lastframe + (attack * (p_left + p_right - 2*p_lastframe))) * slowdown
that's it!
a patch, which works with a 1-d spread and does exactly the stuff described above is downloadable here:
tiki-download_file.php?fileId=559wave 1d.v4p (18.35 Kb)</a>
some tricks:
v_lastframe = p_lastframe - p_beforelastframe (we need another framedelay)
in the 2d case everything is the same. only each point has 4 neighbours:
p = p_lastframe + (v_lastframe + (attack * (p_left + p_right + p_top + p_bottom - 4*p_lastframe))) * slowdown
some tricks:
v_lastframe = p_lastframe - p_beforelastframe
download the wave simulation:
tiki-download_file.php?fileId=578wave01.zip (6.50 Kb)</a>
tiki-download_file.php?fileId=1200wave02.zip (13.71 Kb)</a>
a plugin that extends this algorithm to 3 dimensions can be found in the addonpack at the downloads site.
anonymous user login
~3d ago
~3d ago
~4d ago
~6d ago
~17d ago
~25d ago
~1mth ago
~1mth ago
~1mth ago
~1mth ago