Partikelobjekte

4) Steuerung über Skripts

Partikelsyteme werden über Skripte gesteuert, und zwar in Zusammenhang mit AnimFX-Objekten (siehe Beschreibung zu AnimFX-Objekten).

Ein AnimFX-Objekt hat ein Skript, das mit genau festgelegten Parametern aufgerufen wird. Innerhalb dieses Skripts wird das Partikelobjekt erzeugt, Partikel gesetzt, bewegt, vielleicht auch wieder zerstört, und auch das Partikelobjekt wieder gelöscht.

Die Wirkung des Partikelsystems beruht darauf, wie und wo Teilchen erzeugt werden, nach welchen Regeln und Gesetzen sie sich bewegen, wann welche Teilchen wieder gelöscht werden, ob sie mit anderen Teilchen oder Objekten interagieren usw.

Diese Dinge werden alle im Skript des AnimFX-Objektes festgelegt.

a) Erzeugung von Partikelobjekten

Erzeugen können Sie ein Partikelobjekt mit dem Skript-Befehl

OBJ_NEW 27 <name>
GET_RESULT <name1>

27 ist die Objekt-ID-Nummer von Partikelobjekten,
<name> ist der gewünschte Name des Objektes.
<name1> ist eine Skriptvariable, in der der Name gespeichert wird, den monzoom® dem Objekt gibt.

 

Wichtig!

Das erzeugte Partikelobjekt muß dann in einer internen Pointer-Variable des AnimFX-Objektes gespeichert werden, damit das Partikelobjekt später manipuliert bzw. wieder gelöscht werden kann.

Das Partikelobjekte hat nun noch keine Partikel, bewirkt also noch gar nichts. (Meistens ist es üblich, das Partikelobjekt beim START-Aufruf des Skripts zu erzeugen und beim FINISH-Aufruf des Skripts wieder zu löschen.)

Nach dem Erzeugen sollte festgelegt werden, wieviele Daten pro Partikel reserviert werden sollen. Dafür gibt es den Befehl:

PRT_SET_NPARAM <partikel_obj> <anz-Parameter>

<partikel_obj> ist der Name des Objektes,
<anz_parameter> ist die gewünschte Datenanzahl pro Partikel (zur Zeit ist die Datenanzahl auf maximal 32 begrenzt).

 

Wird für das Partikelsystem pro Partikel z.B. ein Richtungsvektor (3 Werte) und das Alter benötigt, so muß jedes Partikel 4 Datenwerte reserviert bekommen.

 

 

b) Erzeugen von Partikeln

Zu bestimmten Zeitpunkten sollen beim AnimFX-Effekt Partikel erzeugt werden. Eine Möglichkeit wäre es, eine Schleife zu programmieren und mit den Skriptbefehlen

GEO_NEW_PT <part>
GET_RESULT nr

Punkte zu erzeugen. (Die Punkte eines Geo-Objektes entsprechen ja den Partikeln des Partikeln des Partikelobjektes.)

Es gibt aber eine einfachere Möglichkeit mit Hilfe des Skriptbefehls

PRT_NEW_PTS <par> <npts>

So können auf einen Schlag beim Partikelobjekt <npts> Punkte erzeugt werden.

 

 

c) Arbeiten mit Punkt-Bereichen

Bei Partikelsystemen kann es leicht zu vielen 1000 oder gar 10000 Teilchen kommen. Zur Zeit können Partikelsystem nur über Skripts manipuliert werden. Deshalb kann es bei solchen Anzahlen schon eine Weile dauern, wenn die Teilchen einzeln per Skript-Befehlen manipuliert werden sollen.

Daher sind die meisten Partikel-Skript-Befehle so ausgelegt, daß man mit einem Befehl eine ganze Menge von Teilchen auf einmal bearbeiten kann. Es ist z.B. möglich, mit einem Befehl alle Teilchen des Objektes zu bewegen.

Das Prinzip ist, daß man zuvor definiert, welchen Teilchenmenge im folgenden bearbeitet werden soll. Alle darauf folgenden Befehle beziehen sich auf diese Teilchenmenge, solange, bis eine neue Menge definiert wird.

Ist noch nichts definiert, so werden als Menge alle Teilchen des Objekts genommen.

Zur Definition der Teilchenmenge dient der Befehl

PRT_SET_RANGE <par> <range_art> [<von> <bis>]

<par> ist das betreffende Partikelobjekt
<range_art> Art der Teilchen-Menge:

0 bedeutet alle Teilchen
1 bedeutet alle Teilchen mit den Nummer zwischen <von> und <bis> einschließlich
2 bedeutet alle selektierten Teilchen

Sobald PRT_SET_RANGE aufgerufen wird, wirken alle folgenden PRT..-Manipulationsbefehle nur für die Partikel, die solange in der definierten Menge liegen, bis wieder PRT_SET_RANGE aufgerufen wird.

Bei den folgenden Erläuterungen wird die Anwendung des Befehls schnell deutlich.

 

 

d) Position von Partikeln setzen

Wie schon beim Erzeugen der Teilchen würde es auch mit einer Schleife und dem GEO_SET_PT-Befehl gehen.

Einfacher geht es mit dem Befehl

PRT_SET_POS <par> <art> [<param1> <param2>....]

<par> ist das betreffende Partikelobjekt
<art> eine Nummer die steuert, wie die Teilchen erzeugt werden.

Entsprechend werden die folgenden Parameter <param1>... ausgewertet.

0: Punkte bekommen die Koordinaten <param1>,<param2>,<param3>

1: Punkte bekommen Zufällig Koordinaten innerhalb einer Kugel mit dem Mittelpunkt <param1>,<param2>,<param3> und dem Radius <param4>

2: Punkte werden zufällig in dem Zylinder verteilt, der durch die Strecke mit den Endpunkten <param1>,<param2>,<param3> und <param4>,<param5>,<param6> und dem Radius <param7> gebildet wird.

3: Punkte werden zufällig innerhalb des Quaders verteilt, der durch die Bounding-Box <param1>..<param6> gebildet wird.

Für alle Teilchen der aktuell eingestellten Menge wird die Position gesetzt.

 

 

e) Farbe von Partikeln setzen

Für die Farbe gibt es den Befehl

PRT_SET_COL <par> <r1> <g1> <b1> <r2> <g2> <b2>

<par> das betreffende Partikelobjekt
<r1> <g1> <b1> Farbe1
<r2> <g2> <b2> Farbe2

Alle Partikel der aktuelle eingestellten Menge bekommen eine Farbe, die zufällig zwischen den Farben 1 und 2 verteilt ist. (Sollen die Partikel genau die gleiche Farbe bekommen, dann setzt man für Farbe2 einfach Farbe1 ein).

Die Farbewerte gehen normalerweise im Bereich zwischn 0.0 und 1.0. Man kann aber auch stärkere Farbwerte setzen.

 

 

f) Radius und Stärke setzen

Zur Definition von Radius und Stärke gibt es den Befehl

PRT_SET_SIZE <par> <s1> <r1> <s2> <r2>

<par> (siehe oben)

Hiermit wird für alle Teilchen des aktuellen Bereiches der Radius zufällig zwischen den Werten <r1> und <r2> verteilt, die Stärke zwischen <s1> und <s2>.

Damit haben wir schon einmal ein Grundgerüst, um Teilchen zu erzeugen und Farbe und Stärke zu setzen.

Ein Beispiel:

Irgendwann während einer Animation sollen um den Punkt mit den Koordinaten 100, 0, 0 in einer Kugel mit Radius 10 eine Wolke von 1000 roten Partikeln entstehen, die eine Stärke von 0.1 bis 0.2 und einen Radius von 0.5 bis 1 besitzen. Der Name des Partikelobjektes sei in der Variable "par" gespeichert.

 

; abfragen, wieviele Punkte/Teilchen Variable par schon hat

GEO_NPTS par

GET_RESULT np1

; jetzt 1000 neue Teilchen erzeugen

PRT_NEW_PTS par 1000

; um für die neuen Teilchen Pos., Farbe und Stärke zu setzen,

; legen wir den aktuellen Bereich auf np1 bis np1+1000-1

ADD np1 999

GET_RESULT np2

PRT_SET_RANGE par 1 np1 np2

 

; Position setzen

PRT_SET_POS par 1 100 0 0 10

; Farbe setzen

PRT_SET_COL par 1 0 0 1 0 0

; Radius zwischen 0.5 und 1, Stärke zwischen 0.1 und 0.2 setzen

PRT_SET_SIZE par 0.1 0.5 0.2 1

Damit haben wir die Mindestanforderungen für die monzoom®-Partikelsysteme erfüllt. Für einige Effekte reicht das schon.

Wenn man z.B. bei jedem Bild die Position der Partikel neu setzt (per PRT_SET_POS), die Farbe neu bestimmt, so kommt bereits ein interessanter Effekt dabei heraus.

Für viele Spezialeffekte ist es aber nötig, zusätzlich zu Position, Farbe, Radius und Stärke weitere Daten wie z.B. Geschwindigkeit, Alter u.ä. zu speichern und zu bearbeiten. Dies geschieht im Datenfeld der Partikel. Bei der Erzeugung haben wir bereits den Befehl PRT_SET_NPARAM behandelt.

 

 

g) Bewegen von Partikeln

Falls sich alle Partikel in die gleiche Richtung bewegen sollen, kann man das einfach durch Bewegen des gesamten Partikelobjektes erreichen. Interessanter wird es, wenn sich die Partikel alle unabhängig voneinander in verschiedene Richtingen bewegen sollen.

Beispielsweise können die Partikel bei einer Explosion von einem Punkt aus in alle Richtungen davonfliegen. Hierzu muß für alle Teilchen ein eigener Richtungsvektor, bestehend aus 3 Werten (dx, dy, dz), gespeichert werden. Hierfür wird das Datenfeld der Partikel verwendet, welches bereits weiter oben angesprochen wurde.

Für die Richtung werden drei Datenfelder reserviert mit

PRT_SET_NPARAM <pobj> 3

In Feld 0 wird dx gespeichert, in Feld 1 dy und in Feld 2 dz.

 

Ähnlich wie bei der Position gibt es auch einen Befehl, der für alle Partikel des aktuellen Bereiches den Richtungsvektor setzt:

PRT_SET_V <par> <Feld_nr> <art> [<r1>...]

<Feld_nr> ist die Nummer des Datenfeldes, ab der der Richtungsvektor gespeichert werden soll.
<Feld_nr>=0 bedeutet, daß der Vektor in den Datenfeldern 0,1,und 2 gespeichert wird.
<art> ist eine von 3 Arten, wie die Richtungsvektoren gesetzt werden können

Um den Bewegungseindruck während der Animation zu erreichen, müssen die Partikel nach jedem Bild um ihren Richtungsvektor weiterbewegt werden. Dazu dient der Befehl

PRT_ADD_POS <pobj> <Feld_nr>

Dadurch wird bei jedem Teilchen (des aktuellen Bereiches) zur Position der Vektor addiert, der im Datenfeld in <Feld_nr>, <Feld_nr>+1 und <Feld_nr>+2 gespeichert ist. Dadurch werden sich die Teilchen in ihrer gespeicherten Richtung geradlinig weiterbewegen.

Im Datenfeld muß nicht nur die Bewegungsrichtung gespeichert werden, sondern können beliebige andere Daten stehen. Wozu diese verwendbar sind, wird weiter unten beim Arbeiten mit selektierten Punkten deutlich.

Vorher werden die Befehle zum Lesen und schreiben der Datenfelder erläutert.

 

 

h) Verwendung der Datenfelder

Es gibt Befehle, um Datenfelder mit Werten zu setzen, Werte zu addieren, multiplizieren usw. Bei einigen Befehlen ist die Möglichkeit gegeben, einen Zufallsfaktor einzubeziehen.

 

1) PRT_SET_DATA <par> <Feld_von> <Feld_bis> <wert>

Dieser Befehl speichert bei allen Partikeln des aktuellen Bereiches in den Datenfeldern <Feld_von> bis <Feld_bis> den Wert <wert>.

 

2) PRT_SET_DATA_1 <par> <Feld_1> <Feld_2>

Dieser Befehl speichert bei allen Partikeln des aktuellen Bereiches den Wert des Datenfeldes <Feld_2> zum Datenfeld <Feld_1>

 

3) PRT_SET_DATA_2 <par> <Feld_nr> <wert1> <wert2>

Dieser Befehl speichert bei allen Partikeln des aktuellen Bereiches im Datenfeld <Feld_nr> zufällige Werte zwischen <wert1> und <wert2>.

 

4) PRT_ADD_DATA <par> <Feld_von> <Feld_bis> <wert>

Dieser Befehl addiert bei allen Partikeln des aktuellen Bereiches zu den Datenfeldern <Feld_von> bis <Feld_bis> den Wert <wert>.

 

5) PRT_ADD_DATA_1 <par> <Feld_1> <Feld_2>

Dieser Befehl addiert bei allen Partikeln des aktuellen Bereiches zum Datenfeld <Feld_1> den Wert des Datenfeldes <Feld_2> hinzu.

 

6) PRT_ADD_DATA_2 <par> <Feld_nr> <wert_1> <wert_2>

Dieser Befehl addiert bei allen Partikeln des aktuellen Bereiches zum Datenfeld <Feld_nr> einen Wert dazu, der zufällig zwischen <wert_1> und <wert_2> verteilt ist.

 

7) PRT_MUL_DATA <par> <Feld_von> <Feld_bis> <wert>

Dieser Befehl multipliziert bei allen Partikeln des aktuellen Bereiches zu den Datenfeldern <Feld_von> bis <Feld_bis> den Wert <wert>.

 

8) PRT_MUL_DATA_1 <par> <Feld_1> <Feld_2>

Dieser Befehl multipliziert beii allen Partikeln des aktuellen Bereiches zum Datenfeld <Feld_1> den Wert des Datenfeldes <Feld_2> hinzu.

 

9) PRT_MUL_DATA_2 <par> <Feld_nr> <wert_1> <wert_2>

Dieser Befehl multipliziert bei allen Partikeln des aktuellen Bereiches zum Datenfeld <Feld_nr> einen Wert, der zufällig zwischen <wert_1> und <wert_2> verteilt ist.

 

10) PRT_GET_DATA <par> <partikel_nr> <Feld_nr>

Dieser Befehl ließt bei Partikel <partikel_nr> den Wert des Datenfeldes <Feld_nr>. (Hier können leider nicht die Partikel des aktuellen Bereiches gemeinsam ausgelesen werden. denn wo sollten die Werte denn gespeichert werden? Denn Arrays gibt es in REFSKRIPT leider nicht).

 

 

i) Arbeiten mit selektierten Partikeln

Selektierte Partikel spielen eine wichtige Rolle. Das Selektieren wird verwendet, um Partikel zu kennzeichnen, die bestimmte Bedingungen erfüllen und mit denen bestimmte Regeln auszuführen sind. Der Befehl PRT_SET_RANGE kennt auch die Option, als Bereich alle selektierten Partikel zu verwenden. Davon wird hier nun Gebrauch gemacht.

 

Das Schema bei der Verwendung selektierter Partikel ist dabei folgendes:

 

Für das selektieren gibt es neben dem Einzelbefehl GEO_SELECT_PT hier den Spezialbefehl

PRT_SELECT <par> <art> [<r1> <r2>...]

<art> bestimmt dabei nach welcher Bedingung die Punkte selektiert werden.

<art> alle Punkte selektieren,

 

Als Resultat liefert PRT_SELECT die Anzahl Partikel, die die Bedingung erfüllt haben.

 

Achtung!

Im Gegensatz zu vielen anderen PRT_-Befehlen, die auf den aktuellen Bereich ausgeführt werden, prüft PRT_SELECT immer alle(!) Punkte.

Zum Deselektieren gibt es den Befehl PRT_UNSELECT, der genauso arbeitet, nur die Punkte deselektiert.

 

Als Beispiel sollen beim Partikelobjekt "par" alle Partikel gelöscht werden, die vom Punkt 0,0,0 weiter als 100 Einheiten entfernt sind, oder deren Wert von Datenfeld Nr. 2 kleiner als 0 ist.

 

GEO_UNSELECT_ALL_PTS par

; testen, ob Punktkoordinaten außerhalb Kugel 0, 0, 0 mit Radius 100 sind

PRT_SELECT par 8 0 0 0 100

; und testen, ob Wert von Datenfeld2 kleiner als 0 ist

PRT_SELECT par 10 2 0

; die selektierten Partikel löschen

GEO_DEL_SELECTED_PTS par

 

 

Ein weiteres Beispiel soll verdeutlichen, wie man bei Partikeln ein Alter mitberücksichtigen kann. Die Partikel sollen dabei ein bestimmtes Anfangsalter besitzen, und wenn dieses abgelaufen ist, sollen sie gelöscht werden.

Das Alter jedes Partikels wird in einem Datenfeld gespeichert. Die Partikel bewegen sich alle unabhängig; daher brauchen sie auch den Richtungsvektor (d.h. 3 Werte). Also brauchen wir pro Partikel 4 Datenfelder.

Nach dem Erzeugen des Partikelobjektes reservieren wir die 4 Felder mit

PRT_SET_NPARAM par 4

Den Richtungsvektor speichern wir in den Feldern 0 bis 2, das Alter in Feld 3.

 

Wenn neue Partikel erzeugt werden, so müssen zusätzlich zu Position, Farbe, ..., Richtung (s.o.) auch das Alter initialisiert werden. Dies geschieht mit

PRT_SET_DATA par 3 10

Damit speichern wir bei den Partikeln des aktuellen Bereiches im Datenfeld 3 den Wert 10 ein. Die Partikel haben damit das Alter 10. Interessanter wird es, wenn wir das Alter etwas variieren, also eine Zufallskomponente hineinbringen. Das läßt sich mit

PRT_SET_DATA_1 par 3 6 14

erledigen. Damit wird das Alter der Partikel zufällig zischen 6 und 14 verteilt.

 

So, die Animationsberechnung läuft, wir bewegen die Teilchen pro Bild um ihren Richtungsvektor weiter (mit PRT_ADD_POS). Wie wird nun das Alter berücksichtigt ?

 

Die Dauer eines Bildes läßt sich berechnen. Beim Aufruf gibt monzoom® als Parameter auch Start- und Endzeit der Animation, sowie die Bildanzahl an. Wir teilen die Animationsdauer durch die Bildanzahl, haben damit die Zeit pro Bild und speichern sie in der Variable dt. Dieses dt ziehen wir einfach nach jedem Bild vom Alter aller Teilchen ab.

 

; alle Partikel

PRT_SET_RANGE par 0

; dt negieren, da wir abziehen

MUL dt -1

GET_RESULT dt1

PRT_ADD_DATA par 3 3 dt1

; jetzt müssen nur noch alle Teilchen selektiert werden,

; deren Alter (=Feld 3) kleiner als 0 ist. Diese werden gelöscht.

GEO_UNSELECT_ALL_PTS par

PRT_SELECT par 10 3 0

GEO_DELETE_SELECTED_PTS par

 

Das war es schon.

 

< Zurück zur Wirkung auf Beams

Zur Übersicht Partikelobjekte

> Weiter zu Partikelsystemen und Rechenzeit (Beams)

 

© 1997 Oberland Computer