Weitere 3d-Anfänger Tutorials gibt's hier:

Vorwort: In diesem Tutorial zeige ich dir, wie du mit ein bisschen Mathematik und räumlicher Vorstellung, 3d Partikel in deine Spiele einbaust.
Große Kenntnisse sind wie immer nicht erforderlich, du solltest dich jedoch mit Transformationen auseinandergesetzt haben.
Da mich dieses Thema selbst sehr interessiert hat, ist die Beispieldatei diesmal sehr ausführlich. Dort zeige ich 7 verschiedene Einsatzmöglichkeiten von Partikeln, die sich in die Katerorien Natur, Technik und Fantasy einordnen lassen. Einen kleinen Vorgeschmack gibt's hier:

Grundlagen:
Bevor wir anfangen, ein paar grundlegende Dinge.
Partikel werden unter anderem auch als "Billboard" bezeichnet. Dies sind Flächen, die aus einem oder zwei Polygonen bestehen und sich immer in Richtung der Kamera drehen. Diese Rotation täuscht Räumlichkeit vor, wir bräuchten also z.B. keine Ganze Ellipse zu zeichnen, wenn wir einen "leucht-" Effekt haben wollen, sondern können dies viel einfacher, schöner und performanter mit einem Partikel lösen. Das Anwendungsspektrum für Partikel ist schier unendlich, wie du im Laufe des Tutorials erfahren wirst.
Vorbereitung:
Da wir nicht direkt mit dem Zeichnen von Partikeln loslegen können, kommt erst ein bisschen Therorie. Wichtig ist hierbei, dass wir nicht, wie es bei meinen anderen Tutorials der Fall ist, in der Topdown sondern der First Person Perspektive arbeiten.
Das erste, was es zu realisieren gilt, ist es ein Billboard zu erstellen. Zur Erinnerung: Ein Billboard ist eine Fläche, die sich immer in Richtung Spieler dreht.
Erstellen wir also ein neues Objekt und erstellen vorerst eine einfache Wall, so z.B.:
Diese einfache Wand, wollen wir nun auf der Z-Ebene in Richtung des Spielers Drehen. Das sähe vereinfacht so aus (Topdown):
Der rote Punkt ist der Spieler, der schwarze Strich die Billboard.
Das Ganze auf Z Ebene zu realisieren ist sehr einfach, wir erstellen zuerst eine Variable "dir" in unserem Partikel Objekt.
Der zugewiesene Wert ist egal, da wir ihn ohnehin jeden Step ändern.
Im Step Event kommt der entscheidene Teil:
Wir benutzen die eingebaute Methode "point_direction", um den Winkel zu ermitteln, der sich mit den Koordinaten des Partikels und des Spieler Objekts ergibt.
Das Ganze sähe vereinfacht so aus.
Das Ganze muss jetzt auch visuell passieren, dafür benutzen wir Transformationen:
Was hier passiert sollte weitgehend klar sein: Die Fläche wird auf der Z Ebene um den Winkel "dir" gedreht.
Das Ganze muss nun auch auf Y Ebene passieren. Da dieser Winkel jedoch anders berechnet wird, kommt Trigonometrie ins Spiel.
Dies komplett in Text zu fassen wäre Schwachsinn, daher hier eine Skizze (Sideview, Z/X):
Das Ergebinis der Berechnung wird also in das Gradmaß umgerechnet.
Als nächstes müssen wir nun die Formel aus der Skizze (arctan(b/a)) benutzen.
b ist nach der Skizze der Höhenunterschied zwischen Partikel und Spieler. In GML rechnen wir dies so aus:
"abs()" entfernt das Vorzeichen des Ergebnisses, so dass es immer positiv ist. Die Rechnung wäre später fehlerhaft, wenn wir mit einem negativen Ergebnis rechnen.
a ist die Distanz vom Spieler zum Partikel. Diese können wir wieder mit einer eingebauten Funktion ermitteln:
Setzen wir nun a und b in die Formel ein, ergibt sich folgendes:
Wollen wir das Ganze perfektionieren, berücksichtigen wir auch die Neigung der Kamera, indem wir
anhängen.
Damit wären alle Vorbereitungen getroffen. Unser Draw Event sollte nun so aussehen:
Partikel:
Nun haben wir ein Billboard, welches sich immer in Richtung Spieler dreht. Im Folgenden werden wir am Beispiel von Feuer richtige Partikel daraus machen.
Zuerst sollte man sich Gedanken machen, welche Eigenschaften das Partikel haben soll. Hier ein paar Beispiele:
Geschwindigkeit: Nur auf Z Ebene, Schnell
Lebensdauer: Kurz
Textur: Feuer-ähnliche Textur
Farbe: Gelb-Rot
Schwekraft: Keine
Das Create Event könnte man folglich so gestalten:
(Hier eine Beispiel-Textur)
Damit haben wir die Textur und Geschwindigkeit zum Partikel zugefügt, weiter gehts im Step-Event:
Abschließend muss das Draw-Event entsprechend abgeändert werden.
Wir fügen die Farbe und den Blendmode hinzu. Der Blendmode entfernt dunkele Farbtöne aus der Textur btw macht sie transparent. Dies ergibt einen leuchtenden Effekt.
Würde man das Resultat testen, bäkame man diesen Fehler als Ergebnis.
Die Partikel überlappen sich, obwohl dies eingentlich nicht der Fall sein dürfte. Dies ist ein Problem mit der depth, welches sich durch bestimmte Berechnungen beheben lässt. Es gibt jedoch auch einen anderen Weg dies zu vermeiden, und zwar mit dem Befehl
Mit diesem Befehl stellt man das "Hidden surface removal" ab. Dies ist eigentlich notwendig, da so Objekte, die sich z.B. hinter einer Wand befinden, nicht auf den Bildschirm projeziert werden. Da das Gegenteil unser Ziel ist, stellen wir es ab, nachdem wir den Partikel gezeichnet haben, sollte es jedoch wieder aktivert werden. Das Ergebnis wäre dies:
Ganz problemlos ist die Darstellung nach wie vor nicht. Durch das Abstellen vom "Hidden surface removal", kann man die Partikel nun auch durch Wände sehen. Hier hilft vorerst nur trixen, in meinem Example habe ich es beispielsweise so gemacht, dass Partikel nicht mehr gezeichnet werden, wenn ich den jeweiligen Raum verlassen habe.
Ohne Verdecken sieht unser Feuer dann so aus:
Damit man einen Effekt wie auf dem Screenshot bekommt, braucht man natürlich ein Objekt, welches die Partikel erstellt. In diesem Fall also ein Objekt mit folgendem Step-Event:
Dies war eines von unendlich vielen Beispielen für Partikel. Ändert man die Werte entsprechend ab, lassen sich überzeugende Ergebnisse erziehlen.
Hier 3 von 7 Beispielen aus meinem Example:
Das Example umfasst 4 Räume. In drei von ohnen befinden sich Beispiele für Partikel, der vierte ist zum Selbst-probieren.
Die Räume müssen erst betreten werden, sonst werden die Objekte/Partikel nicht dargestellt.
Die Kategorien sind Technik, Natur (dritter Screenshot) und Fantasy (erster und zweiter Screenshot).
Man läuft mit "W" und schaut sich mit der Maus um, Kollision gibt es keine.
Da ich alle Texturen und Modelle selbst angefertigt habe, steht es euch absolut frei, diese auch in eueren Spielen zu benutzen.
Viel Spaß beim Rumexperimentieren!
Moolt
Große Kenntnisse sind wie immer nicht erforderlich, du solltest dich jedoch mit Transformationen auseinandergesetzt haben.
Da mich dieses Thema selbst sehr interessiert hat, ist die Beispieldatei diesmal sehr ausführlich. Dort zeige ich 7 verschiedene Einsatzmöglichkeiten von Partikeln, die sich in die Katerorien Natur, Technik und Fantasy einordnen lassen. Einen kleinen Vorgeschmack gibt's hier:

Grundlagen:
Bevor wir anfangen, ein paar grundlegende Dinge.
Partikel werden unter anderem auch als "Billboard" bezeichnet. Dies sind Flächen, die aus einem oder zwei Polygonen bestehen und sich immer in Richtung der Kamera drehen. Diese Rotation täuscht Räumlichkeit vor, wir bräuchten also z.B. keine Ganze Ellipse zu zeichnen, wenn wir einen "leucht-" Effekt haben wollen, sondern können dies viel einfacher, schöner und performanter mit einem Partikel lösen. Das Anwendungsspektrum für Partikel ist schier unendlich, wie du im Laufe des Tutorials erfahren wirst.
Vorbereitung:
Da wir nicht direkt mit dem Zeichnen von Partikeln loslegen können, kommt erst ein bisschen Therorie. Wichtig ist hierbei, dass wir nicht, wie es bei meinen anderen Tutorials der Fall ist, in der Topdown sondern der First Person Perspektive arbeiten.
Das erste, was es zu realisieren gilt, ist es ein Billboard zu erstellen. Zur Erinnerung: Ein Billboard ist eine Fläche, die sich immer in Richtung Spieler dreht.
Erstellen wir also ein neues Objekt und erstellen vorerst eine einfache Wall, so z.B.:
Diese einfache Wand, wollen wir nun auf der Z-Ebene in Richtung des Spielers Drehen. Das sähe vereinfacht so aus (Topdown):

Der rote Punkt ist der Spieler, der schwarze Strich die Billboard.
Das Ganze auf Z Ebene zu realisieren ist sehr einfach, wir erstellen zuerst eine Variable "dir" in unserem Partikel Objekt.
Der zugewiesene Wert ist egal, da wir ihn ohnehin jeden Step ändern.
Im Step Event kommt der entscheidene Teil:
Wir benutzen die eingebaute Methode "point_direction", um den Winkel zu ermitteln, der sich mit den Koordinaten des Partikels und des Spieler Objekts ergibt.
Das Ganze sähe vereinfacht so aus.

Das Ganze muss jetzt auch visuell passieren, dafür benutzen wir Transformationen:
Was hier passiert sollte weitgehend klar sein: Die Fläche wird auf der Z Ebene um den Winkel "dir" gedreht.
Das Ganze muss nun auch auf Y Ebene passieren. Da dieser Winkel jedoch anders berechnet wird, kommt Trigonometrie ins Spiel.
Dies komplett in Text zu fassen wäre Schwachsinn, daher hier eine Skizze (Sideview, Z/X):

Dies nun in GML umzuschreiben ist sehr einfach:
Da der GM normalerweise in Radiant statt Grad rechnet, fängt die Zeile so an.
Da der GM normalerweise in Radiant statt Grad rechnet, fängt die Zeile so an.
Das Ergebinis der Berechnung wird also in das Gradmaß umgerechnet.
Als nächstes müssen wir nun die Formel aus der Skizze (arctan(b/a)) benutzen.
b ist nach der Skizze der Höhenunterschied zwischen Partikel und Spieler. In GML rechnen wir dies so aus:
"abs()" entfernt das Vorzeichen des Ergebnisses, so dass es immer positiv ist. Die Rechnung wäre später fehlerhaft, wenn wir mit einem negativen Ergebnis rechnen.
a ist die Distanz vom Spieler zum Partikel. Diese können wir wieder mit einer eingebauten Funktion ermitteln:
Setzen wir nun a und b in die Formel ein, ergibt sich folgendes:
Wollen wir das Ganze perfektionieren, berücksichtigen wir auch die Neigung der Kamera, indem wir
anhängen.
Damit wären alle Vorbereitungen getroffen. Unser Draw Event sollte nun so aussehen:
GML-Quellcode
- d3d_transform_set_identity();
- d3d_transform_add_rotation_y(radtodeg(arctan(abs(z-obj_player.height)/point_distance(x,y,obj_player.x,obj_player.y)))-obj_player.z_angle);
- d3d_transform_add_rotation_z(dir);
- d3d_transform_add_translation(x,y,z);
- d3d_draw_wall(0,-2,-2,0,+2,2,-1,1,1);
- d3d_transform_set_identity();
Partikel:
Nun haben wir ein Billboard, welches sich immer in Richtung Spieler dreht. Im Folgenden werden wir am Beispiel von Feuer richtige Partikel daraus machen.
Zuerst sollte man sich Gedanken machen, welche Eigenschaften das Partikel haben soll. Hier ein paar Beispiele:
- Geschwindigkeit (X/Y/Z)
- Lebensdauer
- Textur
- Farbe
- Schwerkraft
Geschwindigkeit: Nur auf Z Ebene, Schnell
Lebensdauer: Kurz
Textur: Feuer-ähnliche Textur
Farbe: Gelb-Rot
Schwekraft: Keine
Das Create Event könnte man folglich so gestalten:

Damit haben wir die Textur und Geschwindigkeit zum Partikel zugefügt, weiter gehts im Step-Event:
Abschließend muss das Draw-Event entsprechend abgeändert werden.
Wir fügen die Farbe und den Blendmode hinzu. Der Blendmode entfernt dunkele Farbtöne aus der Textur btw macht sie transparent. Dies ergibt einen leuchtenden Effekt.
Würde man das Resultat testen, bäkame man diesen Fehler als Ergebnis.

Die Partikel überlappen sich, obwohl dies eingentlich nicht der Fall sein dürfte. Dies ist ein Problem mit der depth, welches sich durch bestimmte Berechnungen beheben lässt. Es gibt jedoch auch einen anderen Weg dies zu vermeiden, und zwar mit dem Befehl
Mit diesem Befehl stellt man das "Hidden surface removal" ab. Dies ist eigentlich notwendig, da so Objekte, die sich z.B. hinter einer Wand befinden, nicht auf den Bildschirm projeziert werden. Da das Gegenteil unser Ziel ist, stellen wir es ab, nachdem wir den Partikel gezeichnet haben, sollte es jedoch wieder aktivert werden. Das Ergebnis wäre dies:
Ganz problemlos ist die Darstellung nach wie vor nicht. Durch das Abstellen vom "Hidden surface removal", kann man die Partikel nun auch durch Wände sehen. Hier hilft vorerst nur trixen, in meinem Example habe ich es beispielsweise so gemacht, dass Partikel nicht mehr gezeichnet werden, wenn ich den jeweiligen Raum verlassen habe.
Ohne Verdecken sieht unser Feuer dann so aus:

Damit man einen Effekt wie auf dem Screenshot bekommt, braucht man natürlich ein Objekt, welches die Partikel erstellt. In diesem Fall also ein Objekt mit folgendem Step-Event:
Dies war eines von unendlich vielen Beispielen für Partikel. Ändert man die Werte entsprechend ab, lassen sich überzeugende Ergebnisse erziehlen.
Hier 3 von 7 Beispielen aus meinem Example:
Das Example umfasst 4 Räume. In drei von ohnen befinden sich Beispiele für Partikel, der vierte ist zum Selbst-probieren.
Die Räume müssen erst betreten werden, sonst werden die Objekte/Partikel nicht dargestellt.
Die Kategorien sind Technik, Natur (dritter Screenshot) und Fantasy (erster und zweiter Screenshot).
Man läuft mit "W" und schaut sich mit der Maus um, Kollision gibt es keine.
Da ich alle Texturen und Modelle selbst angefertigt habe, steht es euch absolut frei, diese auch in eueren Spielen zu benutzen.
Viel Spaß beim Rumexperimentieren!
Moolt
