Partikelemitter 'On-the-fly' erstellen ?
Übersicht

![]() |
Bura.TinoBetreff: Partikelemitter 'On-the-fly' erstellen ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Servus.
Hab mir mal eine kleine Partikelengine geschrieben mit der ich einen Emitter ohne Probleme erstellen und ihm eigene Werte übergeben kann, um so den benötigten Partikelstrom erstellen zu können. Kann mir jemand (evtl. X-Pressive ?) erklären wie man 'On-the-Fly' verschiedene Emitter erstellen kann ? Also ich möchte mehrere Emitter erstellen können, aber nicht für jeden Emitter eine eigene Routine schreiben müssen. Ein gutes Beispiel für so etwas ist X-Pressive's Meteoriten-Einschlagsdemo. |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Indem du irgendwoher die entsprechenden Werte nimmst, um neue Emitter (oder auch Partikel die emittieren wie bei besagter Meteoritendemo) entsprechend zu konfigurieren (textur, position, richtung, farbe, etc etc)
Am einfachsten nimmst du direkt types für die Emitter und hängst ihnen in einem Field ein Pivot an für die Position. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Vielen Dank für Deine schnelle Antwort, aber ich glaube Du hast mich falsch verstanden. Also noch mal ausführlich: Ich habe einen Emitter der so aufgebaut ist (Kurzform): Code: [AUSKLAPPEN] Type Particle3D
Field EmitterPositionX Field EmitterPositionY Field EmitterPositionZ etc... End Type Desweiteren habe ich 3 verschiedene Funktionen zum erstellen, zum updaten und zum anzeigen der Partikel. Diese sehen in etwa so aus: Code: [AUSKLAPPEN] Function CreateParticle3D()
PE.Particle3D=New Particle3D PE\Flares=CopyEntity(Flare) PE\PPosX=Rnd(EmPosX-(EmSizeX/2),EmPosX+(EmSizeX/2)) PE\PPosY=Rnd(EmPosY-(EmSizeY/2),EmPosY+(EmSizeY/2)) PE\PPosZ=Rnd(EmPosZ-(EmSizeZ/2),EmPosZ+(EmSizeZ/2)) PE\SpeedX=Rnd(EmMinSpeedX,EmMaxSpeedX) PE\SpeedY=Rnd(EmMinSpeedY,EmMaxSpeedY) PE\SpeedZ=Rnd(EmMinSpeedZ,EmMaxSpeedZ) PE\Alpha=1 PE\Size=ParticleSize etc... End Function Code: [AUSKLAPPEN] Function UpdateParticle3D()
For PE.Particle3D=Each Particle3D PE\PPosX=PE\PPosX+PE\SpeedX PE\PPosY=PE\PPosY+PE\SpeedY PE\PPosZ=PE\PPosZ+PE\SpeedZ etc... End Function und Code: [AUSKLAPPEN] Function DrawParticle3D()
For PE.Particle3D=Each Particle3D PositionEntity PE\Flares,PE\PPosX,PE\PPosY,PE\PPosZ Next End Function So...Das funktioniert alles einwandfrei. Nur möchte ich eben mehrere solcher Emitter erstellen können, ohne das ich für jeden Emitter auch mehrere Funktionen dieser Art schreiben muss. Ich weis ja vorher auch nicht wieviel Emitter ich erstellen will. 'On-the-fly' eben. |
||
![]() ![]() |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm...
Wie wärs wenn du CreateParticle3D() nochmal aufrufst? Wie ich sehe, ist das ganze ja schon für mehrere Emitter ausgelegt. Einzig und allein die Startpositionierung musst du mal angucken, was da für Werte sind. Sollten natürlich beim mehrmaligen Erstellen von Emittern unterschiedlich sein, sonst sind die alle am gleichen Fleck. MfG D2006 |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@D2006
Wenn ich CreateParticle3d() aufrufe, wird ein Partikel erstellt. Ergo muss ich es 10 mal aufrufen, wenn ich 10 Partikel haben möchte. Wenn ich jetzt 20 Partikel haben will und das an zwei verschiedenen Stellen, so müsste ich diese Funktion 10mal aufrufen mit Parametern der ersten Kategorie (Position, Geschwindigkeit, Winkel etc.) und 10mal mit Parametern der zweiten Kategorie (Position2, Geschwindigkeit2, Winkel2 etc.). Dazu sei ein kleines Beispiel genannt: Mit den ersten 10 Partikeln simuliere ich zum Beispiel Regen und mit den anderen ein Feuer. Wenn man jetzt Code: [AUSKLAPPEN] For PE.Particle3D=Each Particle3D aufruft, so geht er alle Partikel durch. Wie soll ich da zwei verschiedene Sachen draus machen können ?
Besser wäre folgendes: Code: [AUSKLAPPEN] For Emitter=1 to MaxEmitter
For PE.Particle(Emitter)=Each Particle3D(Emitter) ... Next Next Nur leider funktioniert es ja nicht so. |
||
![]() ![]() |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da die Werte der Partikel unterschiedlich sind, ist es doch eigenlich kein Problem verschiedene "Sachen" damit zu machen. Du musst sie halt nur unterschiedlich konfigurieren.
Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, wenn ich noch mal nachfragen muss, aber wie meinst Du das ?
Das ist das erste Mal das ich mich etwas intensiver mit Types beschäftige und wäre über eine kurze Erläuterung sehr dankbar. |
||
![]() ![]() |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Guck dir villeicht ersteinmal das Type-Tutorial von The Shadow an und frag dann nocheinmal explizit was du nicht verstehts, ansonsten ist es etwas aufwendig alles zu erklären^^
Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
mache einen Emittertype
und einen Verweiß von den Particle Typ auf den Emittertyp. und beim Updaten behandelst du sie dann Von Emitter zu Emitter anders, weil du im Emittertyp, X,Y,Z, Geschwindigkeit, ... für den Emitter Speicherst. |
||
between angels and insects |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Jiriki
Das hab ich schon mehrmals durchgelesen. Vielleicht nochmal expliziet etwas zu meinem Problem: Ich erstelle ja ganz am Anfang eine Type-Struktur. Damit kann ich wunderbar einen Partikelemitter aufbauen. Aber eben 'nur' einen, soweit ich weiß. Wenn ich jetzt aber zum Beispiel 10 verschiedene Emitter haben möchte, müsste ich ja dann auch 10 Typestrukturen definieren, oder nicht !? Schon bei 10 solchen Struckturen würde der Code extrem vermehrt werden und außerdem wollte ich ja Emitter im laufenden Programm erstellen können, also ohne das ich vorher schon weis ob da nur 2 oder eben 100 Emitter erstellt werden sollen. @Jan_ Du meinst ich mache einmal sowas hier: Code: [AUSKLAPPEN] Type Emitter
Field EmitterX Field EmitterY Field EmitterZ Field EmitterSpeedX etc... End Type Oder ? Was meinst Du dann mit 'einen Verweiß des Partikeltyps auf den Emitter machen' ? PS.: Die Banane ist krumm, weil sie 40 Jahre um die DDR ziehen musste ! ![]() |
||
![]() ![]() |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstell einfach einen Type für die Ermitter. In ihm legst du dann die Grundwerte für die Partikel, die von den Ermittern erzeugt werden fest, also z.B. Grundgeschwindigkeit, Richtung, Bewegungsart, Image, Anzahl pro sekunde, Größe... Dies Ermitter werden von einer Funktion erzeugt, die in etwa so aussieht:
Code: [AUSKLAPPEN] Function PAR_CreateErmitter (x, y, z, PartikelSize, PartikelImage) ;und bei bedarf noch mehr Ermitter.Ermitter = New Ermitter Ermitter\x = x Ermitter\y = y Ermitter\z = z . . . End Function Und immer wenn du an einer Bestimmten Stelle Partikel erstellen möchtest, aktivierst du den Ermitter (dafür muss es beim Ermitter auch einen Type eintrag geben). In der Hauptschleife hast du eine Function Code: [AUSKLAPPEN] Function PAR_UpdateErmitters () For Ermitter = Each Ermitter ;Hier wird überprüft, ob es nötig ist neue Partikel zu erstellen (aufgrund ;des Ermitterwertes "PartikelsPerSecond (oder so ähnlich)) ;wenn ja, werden ein oder mehrere Neue Partikel erstellt und die Werte ;des Ermitters (PartikelImage, PartikelSize...) werden an diese ;übergeben (eventuell mit einer leichten Zufallsverzerrung in größe und ;Geschwindigkeit, z.B. bei Regen... Die Größe dieser Verzerrung kann ;man auch beim Ermitter festlegen. Next Und dann brauchst du noch eine Funktion PAR_UpdatePartikels () in der die Partikel upgedatet werden (halt ihre Bewegungen...). Und vergiss niht die Partikel nach einer (möglichst kurzen) Zeit wieder verschwinden zu lassen. Auch dafür sollte es einen Basiswert bei den Ermittern geben. Ich hoffe es ist einigermaßen verständlich, sonst frag einfach nocheinmal, Jiriki [Edit:] Warum funktionieren der BB-Code nicht mehr? |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh ich glaube mir ist gerade ein Licht aufgegangen. *leucht* ![]() Genau so ein Beispiel habe ich gebraucht. Ich werde es mal versuchen. Vielen Dank Jiriki. |
||
![]() ![]() |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kein Problem, gern geschehen.
Du kannst es dann ja mal vorzeigen, wie es geworden ist ![]() Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
So kannst du schonmal diverse Arten der Partikel erstellen .
Dafür könntest du jetzt ne über Funktion machen die dir diverse Emitter erstellt und wo du auch direkt mehrere Parameter festlegen und auch an deiner Funk. übergeben kannst . Statt viele Parameter kann du auch direkt ein Emitter Objekt als Parent übergeben und in deiner Partikel Struktur speichern . Wenn du dann alle Partikel durch gehst kannst du auf das Emitter Objekt direkt zugreifen und auslesen . z.B. Emitter.TEmitter=new TEmitter PE\Emitter=Emitter PE\Emitter\StartPosX Function CreateParticle3D(Entity) PE.Particle3D=New Particle3D PE\Flares=CopyEntity(Entity) Function CreateParticle3D(Emitter.TEmitter) PE.Particle3D=New Particle3D PE\Emitter=Emitter |
||
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Jirki
Na klar mach ich das, aber es kann noch ein bissl dauern, da ich mich erstmal intensiv damit auseinandersetzen muss. @Markus2 Ich werde definitiv verschiedene Varianten ausprobieren und mal schauen welche sich dann am besten erweist. @All Noch mal 'ne Frage: Weiß jemand wo man verschiedene Bilder für die Partikel herbekommt oder wie man die selber machen kann ? Flares gibts ja On-Mass, aber ist auf die Dauer zu langweilig. |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Digicam + PhotoShop / PaintShopPro / GIMP
Ich benutze für Texturen meist TextureMaker |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, habe den Thread erst jetzt gesehen ![]() Das Prinzip einer brauchbaren Partikel-Engine ist recht einfach, die Umsetzung aber ziemlich anspruchsvoll. Am besten du erstellst folgende Types: Type: Emitter Eigenschaften: Position, Aktiv / Inaktiv, Rotation, Skalierung, welche Partikelarten sollen wann, wie lange und in welcher Anzahl ausgestossen werden usw. Type: Partikelart Dieser Typ beschreibt, wie Partikel einer bestimmten Art sich verhalten -also Gewicht, Geschwindigkeit, Textur, Grösse, Farbe, Alpha, Bewegung, Emissionsradius, Rotation, Kameraausrichtung und was weiß ich. Man sollte beliebig viele Typen frei definieren können, z.B. einen Partikeltyp für "Feuer", einen für "Wasser", für "Rauch" usw. Type: Einzelnes Partikel Für jedes Partikel, das von einem Emitter ausgestossen wurde, wird ebenfalls ein Typ erzeugt. Darin speicherst du die momentanen Werte dieses Partikels: Rotation, Farbe, Position, Alpha (Mittelpunkt genügt, da du daraus auch die Position der Vertexpunkte errechnen kannst). Wird nun ein Emitter erstellt, erzeugst du eine neue Emitter-Type-Instanz und fütterst ihn mit den Werten, die der User übergibt (z.B. Position des Emitters usw.). Dann muß der User einige Partikelarten definieren. Für jede Partikelart (Wasser, Rauch usw.) wird ein Partikel-Typ angelegt und die definierten Eigenschaften darin gespeichert. Dann sagt man einem Emitter, welche Partikelarten er wann, wie lange und in welcher Anzahl ausstossen soll. Das wird im Emitter-Type gespeichert. Nun rufst du die Partikel-Engine bei jedem Durchlauf auf. Es wird dann folgendes getan: 1. Loope durch alle Emitter. 2. Emitter aktiv? Erzeuge einzelne Partikel mit Eigenschaften der betreffenden Partikelart und streue sie anhand der für diesen Emitter festgelegten Eigenschaften 3. Loope durch alle momentan existierenden Partikel, veränder ggf. ihre Position, Drehung usw. und lösche es, wenn die Lebenszeit abgelaufen ist oder es z.B. völlig transparent geworden ist. So viel zum Prinzip einer Partikel-Engine. Um das aber mit guter Performance und mittels Single-Surface-Technik umzusetzen, solltest du ein gutes Stück Erfahrung mitbringen ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank X-Pressive. Auf Deine Antwort hab ich gewartet, da Du - so denke ich nach Deinem Partikel Candy- am meisten Erfahrungen damit hast.
Ich programmiere seit knapp 18 Jahren und habe auch schon so manche Partikel"engine" erstellt. Aber eben noch nie unter Blitzbasic. Ich werde das erstmal mit Sprites machen, da ich momentan noch null Ahnung von Single-Surface-Techniken habe. Aber sobald das mit Sprites annehmbar läuft, werde ich mich mit dieser Materie auseinandersetzen. @Dreamora Digicam ? Es schneit zwar momentan im schönen Dresden, aber wie soll ich bitteschön eine einzelne Schneeflocke fotografieren können, oder ähnliches ? :O Was meinst Du mit 'TextureMaker' ? Is das ein Programm und hast Du einen Link dazu ? |
||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hehe ich weiss, das momentane Wetter taugt net für viel, hab hier nen halben Meter Schnee vor der Türe *gg*
Betreffend TextureMaker: http://www.texturemaker.com Ist aber nicht umsonst, da wäre dann wirklich nur Pixia oder GIMP als Vorschlag da meinerseits. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm. Gimp hab ich und auch andere Grafikprogramme. Aber ich wüste nicht wie ich das erstellen sollte. Also ich kenne mich in den Programmen zwar gut aus, aber der Ansatz fehlt mir, wie ich sowas am besten realisieren könnte.
Kennst Du dafür irgendwelche Tutorials ? |
||
![]() ![]() |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group