# Animating a jellyfish hardcoding?

I have drew a hemi-sphere by myself, and would like to do basic jellyfish animation by animating the vertices of the hemi-sphere. I tried a lot of experiments but it seems I'm doing it wrong. I need hints or idea on about doing it.

This is the code on how to draw a hemi-sphere. I don't know what values actually to play with to animate the sphere as a jellyfish.

for(float phi = 0.0; phi < 1.567; phi += factor) {

for(float theta = 0.0; theta < 2*3.14 + factor; theta += factor)
{
x = rh * sin(phi) * cos(theta);
z = rh * sin(phi) * sin(theta);
y = -rh * cos(phi);

gl::vertex(Vec3f(x, y, z));

x = rh * sin(phi + factor) * cos(theta);
z = rh * sin(phi + factor) * sin(theta);
y = -rh * cos(phi + factor);

gl::vertex(Vec3f(x, y, z));

}
glEnd();
}

• You should explain more about what you've tried and why/how it didn't work. Is it not drawing correctly? Is it not animating correctly? Sounds interesting though. Commented Apr 16, 2012 at 22:29
• @Byte56 Updated Commented Apr 16, 2012 at 22:32
• Check this out.. openprocessing.org/sketch/25908 Commented Apr 16, 2012 at 23:34

I see. Your update tells me that you are much further from results than I first thought. You're actually looking for an algorithm to define the movement of a jellyfish. That's very complex and is likely thesis level work.

In fact it is thesis level work. See Dave Rudolf's paper (PDF) on the subject. Additionally Marcin Ignac has done some work with the topic.

Perhaps there's some simpler method that I'm not thinking of, but if the linked sites are not suitable for your purposes I think you may be asking for too much. Good luck.

• I have already look at those links. I actually need more resources. Commented Apr 16, 2012 at 23:43

So what you want is a contraction and expansion of the sides in a peristaltic motion to make it look like it's pushing itself. I haven't tried this but the idea should work, it's similar to a cheap waving flag simulation. It is by no means a physical simulation.

First thing you need is a delta Time (dt) to govern how fast the animation will run, and this generates the wave. Second thing you will need is a scale value that you can tweak to make the animation look as good as it can.

What you want to do is modify all your xyz values by a wave based on the values of phi and dt, this will make it change from top to bottom of your hemisphere plus animate over time.

dt is expressed in seconds, a typical frame taking 0.033 to draw. phi ranges from 0 at the top of your hemisphere where you don't want any animation and gets bigger the lower it goes which will make the peristaltic wave larger at the bottom. Scale is needed to tune how big the wave is, a subjective measure of what looks good.

In this example note that x,y and z are all multiplied by the same value. Both sets of your xyz values in the original code would be modified like this each loop.

// setup
dt = 0.033; // modify to make the wave longer or shorter periodicity
scale = 1.0;  // modify to make the wave bigger or smaller
modifier = -cos(dt) * phi * scale;;
// in the loop
x = rh * sin(phi) * cos(theta);
x *= modifier;
z = rh * sin(phi) * sin(theta);
z *= modifier;
y = -rh * cos(phi);
y *= modifier;

• Unfortunately, it is not animating. What about the 2nd part of drawing the hemi-sphere, should I remove it ? Commented Apr 17, 2012 at 0:01
• Nice. Getting some kind of vertex groups system implemented would make this work even better, that way the whole structure can rotate and move more freely without needing to worry about "what is above what". Commented Apr 17, 2012 at 0:02
• @AhmedSaleh I must make a change: add "static float acc = 0;" and then every entry "acc += dt;" then "-cos(acc)" instead of "-cos(dt);" and you will animate. Sorry =) Both sets of xyz in your inner loop should be multiplied by that same modifier. Commented Apr 17, 2012 at 1:27
• @Byte56 that part will be easy, as will scaling/translating because the original vertices are built in a 0..1 range. Commented Apr 17, 2012 at 1:29