Flashterrain vegetation distribution

Flashterrain vegetation distribution

Vegetationsfördelning

Nästa steg är att fördela träden vi nyss skapade i terrängen. Jag använder höjdkartan som källa. Jag skapar en array med objekt som representerar alla pixlar. Anledningen till detta är att jag nu kan filtrera och sortera dessa punkter. Filtrera först bort alla punkter i det definierade intervallet, baserat på y-värdet och intervallet som definieras i editorn. Sedan, sortera ut ett specificerat antal slumpmässiga punkter, sortera dem på z-värdet för korrekt renderingsordning. Innan denna sista sortering kan jag lägga till alla olika objekt i samma batch.

Jag är säker på att det finns mycket bättre och snabbare metoder än detta. Att analysera terrängen för mer realistisk fördelning borde göra den mer intressant. Vid rendering måste jag göra en rendering för varje position och slå samman resultatet med den slutliga bilden. Det fungerar inte att bara klistra in resultatet ovanpå terrängen. Trädet kommer ibland bakom terrängen och blir delvis dolt. Och om terrängen ingår i varje pass så kommer nästa rendering att täcka det föregående.

Så efter lite experimenterande med masker, pixel Bender matt beräkning.

Så var min lösning denna:

  • Gör objektet för sig självt i en transparent visningsport.
  • Lägg till terrängen och ställ in materialet till ett vitt material och bakgrundsfärgen för visningsporten till vit. Flytta objektet till en ny position och rendera.
  • Få boundingbox för alla som inte är vita pixlar med getColorBoundsRect. Det här är rektangeln som vi vill arbeta med. Rita en ny BitmapData med denna rektangel från visningsporten. Låt oss kalla det maskTree, objektet med vita omgivningar.
  • Beskär det genomskinliga passet med samma rektangel som maskTree. Låt oss kalla resultatet transparentTree.
  • Lägg till effekter som dimma och filter som oskärpa till transparentTree.
  • Om trädet täcktes av någon terräng så har kanterna nu raka snitt eftersom vi bara använder en rektangelklippning. Det måste vi fixa. Gå igenom alla pixlar i maskTree. Om den är helt vit i masken så är det en genomskinlig pixel i den genomskinliga bilden, så ställ in den pixeln genomskinlig i transparentTree.
  • Slå samman transparentTree med det slutliga resultatet. För att göra detta, lägg den sista duken och det nya objektet i sprites och cachelagra dem med draw() till ett nytt slutligt lager.
  • Skicka en händelse så att användaren kan följa framstegen och börja om med nästa iteration.

Jag försökte använda ett matt pixelbender-filter så att jag bara behövde rendera viewporten en gång, men alfakanalen i flash är förmultiplicerad (rätta mig om jag har fel här), så kanterna blev vita när den blandas med det sista lagret. En nackdel är att det går ganska långsamt. En annan är z-sorteringsproblemen som uppstår. Kanske kan en nedsamplad höjdkarta användas istället när man ställer in positionen i 3d-rymden.

Skuggor och effekter

Eftersom resultatet av varje träd är en enda transparent bitmapp, så kan jag använda olika effekter på varje träd. Ett oskärpe filter baserat på avståndet till kameran läggs till. Ett litet slumpmässigt värde på nyansen/mättnaden gör träden mer slumpmässiga. Om dimma är aktiverat så läggs en färgton till. Jag fick inte reda på hur man ändrar färgomvandlingen korrekt, så jag hittade en lösning genom att ställa in nyansen med TweenMax och ändra förloppet till 0-1 beroende på z-positionen och mängden dimma. Måste jobba mer med detta senare.

Jag nämnde skuggskikten i ett av de tidigare inläggen. För att lägga till varje skugga till det slutliga resultatet, så gör jag en tillfällig behållare och lägger till en sprite med en radiell gradientfyllning för varje träd och cachelagrar det med bitmapData.draw(). Detta bakas sedan in i konsistensen med multipliceringsblandningsläget.

Saker att förbättra:

  • Det finns gott om optimering att göra här. Detta är den mest tidskrävande delen.
  • Kontrollera sikten mot klipplanen och hoppa över dessa objekt.
  • Justera alla effekter med bättre z-djupkontroll.
  • Låt solens läge påverka ljusstyrkan.
  • Mer realistisk fördelning som lutningsdetektering eller algoritmer.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *