Kapičky aneb Metaballs
Metaballs, blobs, kapičky. Jde o technologii využívanou hojně v 3D modelování organických povrchů a uživatelsky jsem se s ní poprvé setkal u programu PoV-Ray.
Nejlepší ukázkou kapiček je klasický film Terminátor 2, kde se stříbrolesklé kapičky tekutého kovu slévají v ničivou bytost.
Zde si lze stáhnout primitivní demo, vyrobené v Game Makeru, předvádějící jednoduché vzlínání dvou kapiček. Vysvětlení dále v článku.
Princip:
Základní kapička je kruhová a je definována svým středem x,y a poloměrem r. Představme si, že kapička má něco jako elektrický náboj. Uprostřed nejvyšší a na okraji nejnižší. Za okrajem ( tzn. ve vzdálenosti větší než r ) je vždy nula.
* Popisuji pro jednoduchost ve 2D, každý další přidaný rozměr způsob výpočtu nemění.
Každá kapička má tedy jakýsi svůj vliv na své okolí do vzdálenosti r. Ale co uvnitř? Vliv má být plynulý a tak by všechny body kruhu měly mít něco mezi 1 a 0. U metaballs se používá funkce:
vliv = (1-(d/r) 2 ) 2
kde d je vzdálenost zjišťovaného bodu od středu kapičky
r je poloměr kapičky
a výsledný vliv je hodnota od 0 do 1 podle polohy
Pokud máme kapiček víc, tak se jejich vlivy jednoduše sečtou. Když vyberu nějaký bod, tak budu kreslit jeho průhlednost jako:
vliv_kapičky_1+vliv_kapičky_2+vliv_kapičky_3…atd
Samosebou nemusím brát v potaz příliš vzdálené kapičky a taky pokud vyjde průhlednost větší než 1, ořežu výsledek na rovno 1.
Podle vlivu jednotlivých kapiček je možné vykreslovat všelicos, ne jen průhlednost. Já jsem v demo ukázce měnil odstín vykreslovaného bodu.
Samotná funkce v Game Maker Language vypadá takto.
Pokud potřebujeme, aby různé kapičky měly různou sílu, násobíme vliv oné kapičky hodnotou té síly. Skládáním kapiček lze získat roztodivné tvary a pokud použijeme zápornou sílu, bude „negativní“ kapička vykusovat z pozitivních kapiček díru.
Pro vyzkoušení kapiček bez programování si lze stáhnout PoV-Ray, který je zdarma a umí kapičky snadno zobrazit. Stačí do textového souboru opsat text uvedený níže, otevřít ho v PoV-Ray a dát v menu příkaz Render.
#include "colors.inc" background{White} camera { angle 15 location <0,2,-10> look_at <0,0,0> } light_source { <10, 20, -10> color White } blob { threshold .65 sphere { <.5,0,0>, .8, 1 pigment {Blue} } sphere { <-.5,0,0>,.8, 1 pigment {Pink} } finish { phong 1 } }
PoVRay zobrazí dvě kapičky v prostoru. Souřadnice jsou ta čísla <x,y,z> v řádcích za slovem sphere. Následuje velikost r, pak síla a nakonec barva. Vše lze měnit. Kapičky můžete po řádcích přidávat v libovolném množství.
Podrobnosti k používání kapiček v PoV-Ray online zde.
Výsledek vypadá nějak takhle:
41 odezev
Pěkný článek. +1
Popravdě jsi toho neřekl o moc víc, než v původních komentářích a ani jsi neodpověděl na mé otázky. 😀 Nicméně jsem si dal sám dvě a dvě dohromady, takže moje představa je takováhle: pro každý blob budu mít nějaký bounding box (či kruh, rozumíme si), o něco větší než blob sám. Pro každý bod v blobu budu počítat barvu či něco jiného podle rovnice, neustále vzhledem ke vzdálenosti ke středu blobu. Když se mi do něj přitulí box jiného blobu, tak se mi do rovnice promítne i vzdálenost k němu a podle toho doje k blobovatému efektu. Chápu to dobře?
Chápu dobře, že každý snímek musím počítat rovnici s mocninami a kde dělím distanci poloměrem, tzn. v plovoucí čárce, a to pro všech dejme tomu 1024 pixelů blobu o boxu 32×32, všech dvaceti blobů co mi bude lítat po obrazovce. A k tomu se mi samozřejmě musí kontrolovat ty kolize, tzn. u každého jednoho blobu v každém snímku proiterovat ostatní bloby, jestli se náhodou nepotkali? 😀 To prostě nemůže běžet plynule! 😀
Fakt nevím, jak bych to popsal jednodušeji, ale myslím, žes to snad celkem pochopil. Asi by ti pomohlo udělat si pár pokusů v samostatném projektu, abys viděl, jak se to chová. Prostě si to osahat.
Ohledně rychlosti nemůže být problém. V C# bys měl být schopen počítat okolo 500 blobů velikosti 32×32 na 60fps i v případě, že píšeš neefektivně ( odhad založený na poměrné výkonnosti ). Když si uvědomím, že to jde realtime i prostoru…
To určitě udělám, dříve či později. 🙂 Uvidíme no. Já se v Umu floatovým operacím obloukem vyhýbám (co můžu spočítám jednou a pak nechám být), přesto tedy mám místy docela hodně výpočtů a docela hodně renderování – všechno renderuji ve skutečnosti dvakrát, protože pseudo bloom – a hra běží naprosto plynule v 60fps i na telefonu.
To je tak, když někdo dostane do ruky velký výkon a neví co s ním. 😀
Většinu času nemusíš ve skutečnosti počítat nic. Využij předpřipraveného spritu. Pak spočítáš kde a kdy dojde ke kolizím. Když jsou kolize dostatečně blízko, počítáš kolidované bloby. Tzn. jen je. TomBenova ukázka počítá celé AoE, což je ale zcela zbytečné a vhodné jen do ukázky. Počítáš hue do hsv spektra, kde sat a val víš.
Ps: Místo mocniny je krásné vyzkoušet logaritmy.
Ano, to je samozřejmě vhodnější způsob, ke kterému bych došel hned, jak bych to začal psát – už jen proto, že je by to bylo jednodušší. 😀 Co počítám, resp. pro co ten údaj použiju, je teď naprosto irelevantní řekl bych – pravděpodobně bych podle toho měnil víc věcí a určitě by ani jednou z nich nebyl odstín. 🙂
EDIT: Hmm.. logaritmem bych mohl získat ostřejší (ale přesto vyhlazené) hranice objektu, pokud bych jím upravoval alfu. Je to tak?
K editu: Přesně tak.
Koukal jsem na novou verzi, co jsi postnul. Ten efekt „dráhy“ je částicový?
Protože jestli jsi kvůli tomuhle psal celý pt systém… 😀
Kdepak, nepsal jsem celý systém. 😀 Mám tam třídu, která mi opatřuje všechna grafická „cukrlátka“ a třeba i to hýbání obrazem a akční text. No a ta spravuje pár instancí velice jednoduchý tříd, které by se daly označit za částice, ale jsou opravdu silně primitivní a jednoúčelové.
Je víc způsobů, jak to počítat. Já jsem použil nejrychlejší rovnici. GM by složitější výpočty nestíhal. 🙂
Ono to s GMS zas tak špatné není. Po mukách způsobených vlastní hloupostí jsem dopsal equipment k inventáři. 800 fps v pohodě i přesto, jak jsou prováděné výpočty náročné. Ono to ale takhle šlape proto, že výpočty provádím, jen když musím. Kdybych je stepoval, tak jsem tak o 200 fps níž.
Hm. A náročné výpočty jsou u tebe jaké?
Pak ti pošlu zdroják. Uvidíš sám.
perfect
thank you for a very good article
3follower
defending dissertation https://professionaldissertationwriting.org/
dissertation writing services uk https://dissertationwritingcenter.com/
electronic engineering dissertation ideas https://dissertationhelpexpert.com/
dissertation help service quality https://accountingdissertationhelp.com/
uk dissertation writing https://businessdissertationhelp.com/
dissertation proposal template https://customdissertationwritinghelp.com/
best dissertation help services https://writingadissertationproposal.com/
writing a dissertation methodology https://customthesiswritingservices.com/
spain online casino https://download-casino-slots.com/
cafe casino online https://onlinecasinofortunes.com/
best payout online casino https://newlasvegascasinos.com/
online casino index https://onlinecasinosdirectory.org/
zone online casino login https://9lineslotscasino.com/
live casino online pa https://free-online-casinos.net/
casino las vegas online https://internet-casinos-online.net/
jacks entertainment online casino https://cybertimeonlinecasino.com/
caesars palace online casino https://1freeslotscasino.com/
goldennugget casino online https://casino-online-roulette.com/
best casino online real money https://casino-online-jackpot.com/
vegas casino online free spins https://ownonlinecasino.com/
what is the best online casino https://all-online-casino-games.com/
top online casino bonuses https://casino8online.com/
cisco vpn client download https://freevpnconnection.com/
best vpn china https://freehostingvpn.com/
buy vpn with paypal https://superfreevpn.net/
best vpn app for windows https://free-vpn-proxy.com/
buy hma pro vpn https://rsvpnorthvalley.com/