Metaball, czyli dzisiaj powiem parę słów na temat kulek. Według wiki służą one do symulacji i graficznej reprezentacji organicznych obiektów. Ja dzisiaj chciałbym pokazać ich realizacje przy pomocy raymarchingu i shaderow OpenGL. Nie będzie tutaj nic specjalnego i ciężkich obliczeń 😛

Nie jest to nie c skomplikowanego, a efekt może być naprawdę ładny. Uzyskamy go poprzez animację położenia i wielkości kilku obiektów łączonych przy pomocy funkcji softJoin.

Na filmiku widać dokładniej o co chodzi:

W skrócie, główna procedura jak zwykle znajduje się w funkcji map, gdzie wyliczamy obiekty z parametrami zależnymi od czasu i łączymy je przy pomocy funkcji softJoin.

Metoda mapowania dla sześcianów:

vec2 map(vec3 p) {
vec2 hit=plane(p, vec3(0.0, -0.5, 0.0), vec3(0.1, 1.0, 0.1), 0.0);
vec2 cube=roundBox(p, vec3(cos(time * 0.5) * 1.0, 1.0, sin(time * 0.5) * 2.0), vec3(0.3), 0.3, 2.);
vec2 cube2=roundBox(p, vec3(cos(time * 0.5) * 1.0, sin(time * 2.0) * 1.0, sin(time * 0.5) * 2.0), vec3(0.3), 0.3, 3.);
vec2 cube3=roundBox(p, vec3(cos(time * 1.5) * 2.0, cos(time * 2.0) * 1.0, sin(time * 0.5) * 1.0), vec3(0.3), 0.3, 4.);
cube=smothJoin(cube, cube2, 0.5);
cube=smothJoin(cube, cube3, 0.5);
hit=join(hit,cube);
return hit;
}

Metoda mapowania dla kulek:

vec2 map(vec3 p) {
vec2 hit=plane(p, vec3(0.0, -0.5, 0.0), vec3(0.1, 1.0, 0.1), 0.0);
vec2 ball1=sphere(p, vec3(1.0 + cos(time * 0.5) * 2.5, 1.0 + cos(time * 0.5) * 0.4, sin(time * 0.5) * 0.5), 0.7 + sin(time * 2.0) * 0.3, 2.);
vec2 ball2=sphere(p, vec3(1.0 + sin(time * 0.4) * 0.5, 1.0 + sin(time * 0.5) * 1.4, cos(time * 0.3) * 0.5), 0.6 + sin(time * 1.0) * 0.3, 3.);
vec2 ball3=sphere(p, vec3(1.0 + sin(time * 0.3) * 0.5, 1.0 + sin(time * 0.5) * 0.4, cos(time * 0.7) * 0.5), 0.5 + sin(time * 1.2) * 0.3, 4.);
vec2 ball4=sphere(p, vec3(1.0 + sin(time * 2.2) * 0.5, 1.0 + sin(time * 0.5) * 0.4, cos(time * 0.8) * 1.5), 0.4 + sin(time * 0.2) * 0.3, 5.);
ball3=smothJoin(ball3, ball4, 0.5);
ball2=smothJoin(ball2, ball3, 0.5);
ball1=smothJoin(ball1, ball2, 0.5);
hit=join(hit,ball1);
}

Interaktywne demo dostępne tutaj