U kunt een verscheidenheid aan effecten creëren met particle-systemen. In dit artikel ga ik een eenvoudige manier beschrijven om ze te verbeteren door wat turbulentie toe te voegen. Ik zal beginnen met een 2D-deeltjessysteem voor de eenvoud. Codevoorbeelden staan in Javascript, maar ze zijn meestal wiskunde, dus het is eenvoudig om ze aan te passen aan een andere taal.
gerelateerde berichtenLaten we beginnen met het maken van een normaal deeltjessysteem in 2D. We gebruiken eenvoudige sprites met:
X
, Y
.vx
, vy
.Voor elk deeltje werken we eerst de snelheid bij. In dit geval dempen we het een beetje om beweging interessanter en realistischer te maken. Krachten zoals zwaartekracht of wind kunnen hier ook worden toegepast.
var demping = 1-0.005 this.vx * = demping this.vy * = demping
Vervolgens werken we de positie bij met behulp van de snelheid. We gebruiken de vaste tijdstap voor deze tutorial. Als uw tijdstap varieert, moet u de snelheid vermenigvuldigen met uw tijdsinterval om van positie te veranderen.
this.x + = this.vx this.y + = this.vy
We schrapen deeltjes een beetje om expanderende rookwolken te simuleren.
this.scaleAll (1,01)
We hergebruiken deeltjes in plaats van ze te verwijderen en toe te voegen, omdat we hier een constante stroom willen:
this.life- = 1 if (this.life<=0) this.respawn(particleLifetime)
En ten slotte werken we transparantie van deeltjes bij om ze na verloop van tijd te vervagen.
this.alpha = this.life / particleLifetime
De respawn
methode stelt alleen beginwaarden voor het deeltje in. Het wordt ook gebruikt om het particle-systeem te vullen bij het opstarten.
this.x = jaws.width * (Math.random () * 0.1-0.15) this.y = jaws.height * (0.45 + Math.random () * 0.1) this.vx = Math.random () * 2+ 4 this.vy = (Math.random () + Math.random () + Math.random () - 1.5) * 2 this.life = life this.scaleTo (1)
De bepalende eigenschap van turbulentie is de vorticiteit. Dus de eenvoudige en eenvoudige manier om turbulentie te simuleren, is om een vortex-object te maken dat de beweging van deeltjes beïnvloedt.
Laten we beginnen met het berekenen van de snelheid in de vortex, alsof het een solide wiel zou zijn.
Snelheid op het punt op het wiel. Wielafbeelding door Pearson Scott Foresman van Wikimedia Commons.Ten eerste hebben we een vector van het draaikolkcentrum naar het deeltje nodig:
var dx = particle.x-vortex.x var dy = particle.y-vortex.y
Vervolgens roteren we die vector 90 graden om een orthogonale vector te maken en vermenigvuldigen deze met de rotatiesnelheid van de vortex:
var vx = -dy * vortex.speed var vy = dx * vortex.speed
Geweldig, we hebben de snelheid die de vortex probeert te forceren op de deeltjes, maar hoe passen we die toe?
We hebben een weegfactor nodig die 1 in het midden van de vortex zal zijn en met de afstand zal vervagen.
We gebruiken deze ad-hoc formule, die gebaseerd is op inverse vierkante afstand, maar vermijdt singulariteit in het midden:
var factor = 1 / (1+ (dx * dx + dy * dy) / vortex.scale)
Laten we de wervelsnelheid toepassen door deze met de deeltje-één te mengen:
particle.vx + = (vx-particle.vx) * factor particle.vy + = (vy-particle.vy) * factor
Dat is alles. We hebben nu een draaikolk die deeltjes beïnvloedt!
Een enkele statische vortex is goed om uit te zoeken hoe deze op de deeltjes moet worden toegepast, maar we willen meerdere wervelingen en we willen dat ze bewegen. Laten we ze gewoon in een ander (onzichtbaar) deeltjessysteem maken! Dus nu hebben ze ook snelheid en levensduur. Dat heeft enkele wijzigingen in de code nodig.
Bij het berekenen van de snelheid in de vortex moeten we ook de vortexbeweging toevoegen:
var vx = -dy * vortex.speed + vortex.vx var vy = dx * vortex.speed + vortex.vy
En we willen dat de wervels soepel in en uit gaan en niet zomaar plotseling in en uit het pop verschijnen. Laten we een eenvoudige curve toepassen op de wegingsfactor:
var lifeFactor = vortex.life / vortexLifetime factor * = (1-lifeFactor) * lifeFactor * 4
In het voorbeeld van deze tutorial gebruik ik verschillende wervels die vergelijkbaar zijn met de deeltjes, maar een iets kortere levensduur hebben. Het op verschillende manieren verplaatsen van wervels, maar ook het afstemmen van de rotatiesnelheid en het bereik, kan een overvloed aan verschillende effecten produceren.
Omdat een vortex bijvoorbeeld probeert deeltjes mee te bewegen, zal een statische vortex proberen om te voorkomen dat deeltjes erdoorheen vliegen en ze in een werveling plaatsen. U kunt dit effect gebruiken om een turbulent gebied te creëren dat de deeltjes die erin terechtkomen, vertraagt.
U kunt vortex maken wanneer een personage in het spel beweegt of wanneer een voorwerp in de grond valt.
Kármán vortex straat veroorzaakt door wind die rond de Juan Fernández-eilanden stroomt langs de Chileense kust. Afbeelding door Bob Cahalan van Wikimedia Commons.Een algemeen turbulentie-effect is vortexstraat die ook gemakkelijk opnieuw te maken is, voor een statisch object in de stroom of voor een snel bewegend object.
Je kunt ook wervelingen tegen de omgeving botsen of de beweging van het personage beïnvloeden.
Ik heb de deeltjes in het voorbeeld niet geroteerd. Het is eenvoudig toe te voegen en het verbetert het normale particle systeem, maar het kan verder worden verbeterd door vortices te gebruiken. Meng eenvoudig de rotatiesnelheid van de deeltjes met de vortex zoals we deden met de lineaire snelheid.
U kunt vortexbeweging verbeteren door andere wervels te laten werken, net als bij deeltjes.
Verschillende functies voor vortexweging kunnen verschillende resultaten opleveren. Ik heb zojuist een ad-hoc gebruikt die voor dit voorbeeld heeft gewerkt, maar misschien vindt u anderen meer geschikt voor uw zaak. Vrijwel alles wat uitsterft met de afstand van het centrum zal het doen.
De techniek is ook eenvoudig in 3D te gebruiken. Gebruik 3D-vectoren voor posities en snelheden (inclusief vortex-hoeksnelheid) en bereken de snelheid in de vortex met behulp van crossproduct:
Vector3 r = particle.position-vortex.position; Vector3 v = Vector3.Cross (vortex.angularVelocity, r);
Het is natuurlijk niet de enige manier om turbulentie te veroorzaken en niet de enige manier om wervelingen te doen. Laten we naar een paar anderen kijken.
We gebruikten de lijst met wervels op het niveau van het deeltjessysteem. Het is redelijk efficiënt, maar je kunt een vortex (of meerdere) in elk deeltje opslaan.
Hoewel het meer geheugen nodig heeft, verbetert het de datalokaliteit en maakt het de deeltjesbeweging nog meer aan. Je kunt de vortex een bit willekeurig maken voor elk deeltje of verschillende lagen wervels gebruiken om het 2D-deeltjessysteem er meer 3D uit te laten zien.
In plaats van de lijst met wervels in het deeltjessysteem op te slaan, kan deze globaal worden gemaakt. Dit spaart geheugen en CPU-tijd bij het bijwerken van vortices. Het is ook gemakkelijk om nieuwe vortices toe te voegen die worden veroorzaakt door beweging van tekens, in botsing komen met wervelingen met de omgeving, enz.
U kunt een meer realistische route kiezen en daadwerkelijke fysieke simulatie van de stroom uitvoeren. Het is waarschijnlijk te zwaar voor iets van gemiddelde grootte in 3D zonder GPU-computing, maar heel goed mogelijk in 2D. Er zijn op rasters gebaseerde methoden (u wilt multi-resolutiemethoden voor prestaties) en op deeltjes gebaseerde methoden. Kijk ook naar het toevoegen van verloren gegane vorticiteit door ruis, daar zijn papieren over.
In plaats van een volledige fysieke simulatie of partikelachtige wervels te doen, kunt u de vorticiteit in een raster opslaan. Sla hoekige en lineaire snelheden op en verspreid ze bij elke tijdstap. Probeer vervolgens in het deeltjessysteem het raster te bemonsteren om de vortexsnelheid te vinden die het deeltje beïnvloedt.
Het is niet zo realistisch als vloeistof-simulatie, maar het is veel sneller omdat je geen full-grid drukvergelijkingen hoeft op te lossen, gewoon voortplanting en vochtige snelheden.
Als je gewoon heel wat chaotische turbulentie wilt zonder uitgesproken wervelingen ("borrelen"), kan het gebruik van procedurele ruis een beter idee zijn. Let op Perlin of simplexgeluid. Je hebt een extra dimensie nodig om het geluid te animeren. Dus voor 2D hebt u 3D-ruis nodig die in de derde dimensie wordt gescrolld in de tijd en 4D-ruis voor 3D.
Je kunt het geluid verschillende keren samplen bij sommige vaste verschuivingen om ervoor te zorgen dat componenten van de kracht je deeltje beïnvloeden.
Nu kunt u uw deeltjeseffecten verbeteren door een secundair systeem van vortex-deeltjes toe te voegen. Stel je een explosie voor die wordt veroorzaakt door een raket die nabijgelegen rook dwingt om rond de straal van de explosie te wervelen, of bladeren die kolken als ze in een rivier drijven. Experimenteer met hoe je wervelingen laat spawnen en bewegen om het gewenste effect te bereiken of iets nieuws te ontdekken!