Partikelemitter 'On-the-fly' erstellen ?

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Bura.Tino

Betreff: Partikelemitter 'On-the-fly' erstellen ?

BeitragDi, März 07, 2006 2:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragDi, März 07, 2006 2:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 2:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

D2006

Administrator

BeitragDi, März 07, 2006 2:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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

BeitragDi, März 07, 2006 3:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

ke^kx

BeitragDi, März 07, 2006 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

ke^kx

BeitragDi, März 07, 2006 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 ! Laughing
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

ke^kx

BeitragDi, März 07, 2006 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh ich glaube mir ist gerade ein Licht aufgegangen. *leucht* Laughing
Genau so ein Beispiel habe ich gebraucht. Ich werde es mal versuchen.
Vielen Dank Jiriki.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

ke^kx

BeitragDi, März 07, 2006 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem, gern geschehen.

Du kannst es dann ja mal vorzeigen, wie es geworden ist Smile

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

BeitragDi, März 07, 2006 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragDi, März 07, 2006 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, habe den Thread erst jetzt gesehen Wink

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 Wink
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Bura.Tino

BeitragDi, März 07, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragDi, März 07, 2006 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 07, 2006 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group