# Image-Space 3D Metaballs

This topic is 2874 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

##### Share on other sites
It's not too hard to add normals. Basically when you're rendering your billboards, you need to calculate xy values such that x and y are of the range[-1, 1] (where (-1, -1) is the bottom left corner of your quad, and so on). Then you output these x and y values along with your weight value (height), and you scale x and y by the weight.
float dist = length(xyPos);float weight = CalcGaussianWeight(dist);xyPos *= weight;return float4(xyPos, 0, weight);

Then in your final pass where you sample the summed weights, you can calculate a normal like this:
float3 normal = normalize(float3(sample.x/sample.w,                                 sample.y/sample.w,                                  max(sample.w - 0.08f, 0)));

Of course you may need to negate your Z depending on your coordinate system.

This is a screen from a little demo I made with this technique a while back:

##### Share on other sites
Awesome - helpful as always, MJP.

I decided to use cubemap reflections, a non-spherical (paint splat) heightmap/brush, with normals:

[Edited by - Akitsune on March 10, 2010 3:59:09 AM]

##### Share on other sites
this is awesome! I currently used raycasting combined with spatial hashing on the GPU to make realtime 3D metaballs but this is so much simpler :)

I will give this a try for sure!

edit:
anyways I am curious what happens if you move the camera? does that look weird?

##### Share on other sites
Quote: Original post by mokaschitta
this is awesome! I currently used raycasting combined with spatial hashing on the GPU to make realtime 3D metaballs but this is so much simpler :)

I will give this a try for sure!

edit:
anyways I am curious what happens if you move the camera? does that look weird?

Thanks! No, not like you'd expect from a billboard method - that's what makes it pretty neat.

Updated the demo, WASD to see for yourself:

http://astraios.net/test/Meta.zip

I'd share the source, but I'm using 3D middleware and it's horribly organized. If someone REALLY wants it, just ask.

PS: Try changing the Drop.png texture to any other grayscale picture.

edit: fixed to new link, source included Edited by Akitsune

##### Share on other sites
Hey,

I am on a mac, so I cant test your demo. Anyways I thought about the method a little more and correct me if I am wrong:

this method interprets all metaballs having the same z value right? I could move one metaball in front of all the others.

An also no matter how far away a metaball is, it will contribute to the current pixel due to the additive blending.

Did you solve that anyhow or is that a limitation you have to take when using this method?

##### Share on other sites
Right. I render the billboards using back-front sorting, so the z position is proper.

Correct - metaballs contribute from any distance. This is a limitation, but it isn't a huge one and is barely noticeable - this is what the threshold and billboard size should be adjusted to minimize artifacts. I'm working on adding depth so I can retrieve the world position from the metaballs and eventually use triplanar texturing which like likely have artifacts due to this.

##### Share on other sites
cool, let us know how it works out. if you get correct depth to work somehow this is a neat method.
I want to be able to move metaballs in front of each other without resulting in one big blob (as it would be with this method).

##### Share on other sites
I tried your demo on Windows 7 x64 and it gives me an error saying that is is not a valid Win32 application.

##### Share on other sites
Quote:
 Original post by maspeirI tried your demo on Windows 7 x64 and it gives me an error saying that is is not a valid Win32 application.

Looks like I forgot to build in x86 mode, sorry! Uploading a fixed version.