Anzeige
Tutorialbeschreibung

Thinking Particles: Fallende Blätter

Thinking Particles: Fallende Blätter

Vom Baum fallende Blätter – das allherbstliche Ärgernis für Parkgärtner, die für Wochen zu Rechenschiebern mutieren.
Vom Baum fallende Blätter – eine knifflige Aufgabe für 3D-Jünger, die uns trotzdem nur relativ wenig Zeit kosten wird.
Wir werden keine perfekte Lösung erarbeiten, aber eine, die uns Ideen für eine Weiterumsetzung, für mehr Raffinesse, für mehr Details geben wird. (Mit Thinking Particles)


Dieses Tutorial ist etwas länger geworden, als es eigentlich notwendig gewesen wäre. Ich könnte die einzelnen Schritte herunterbeten und nach einer Seite fertig sein. Aber ich möchte versuchen, diese Schritte möglichst plausibel zu erklären. So kann der eine oder andere Leser vielleicht mehr als nur eine Einweglösung aus diesem Tutorial gewinnen.

Ich arbeite mit der englischen Sprachversion. Das ist einfach eine Tatsache, die ich nicht ändern werde. Ist so, bleibt so.
Viele Wege führen nach Rom. Es gibt Ansätze mit Mograph, mit Cloth, ich habe mich für eine Umsetzung mit TP entschieden. TP (Thinking Particles) erlaubt es uns, mit den Blättern zu spielen, sie weitgehend zu beeinflussen, sie zu Boden fallen zu lassen und auch dann noch Kontrolle über sie zu haben. Für TP gibt es zwei Ansätze, hier ist die Idee für Nummer eins:

Am Anfang war der Baum...

Wir brauchen einen Blattspender. Das kann etwas Selbstmodelliertes sein, ein mit einem Baumprogramm erstellter oder ein aus dem Web geladener. Ich habe bei Turbosquid nachgeschaut, da gibt es eine Menge freier Bäume, an anderen Stellen des WWW gibt es noch viel mehr davon.

Unser Baum muß nur eine Voraussetzung erfüllen – das Blattwerk muß als separates Objekt vorliegen. Sollten die Blätter eine Selektion sein, müssen wir daraus ein eigenes Objekt machen, sollten die Blätter einzelne Objekte sein, müssen wir sie verbinden. Dabei sollte das Mapping der Blatt-Texturen natürlich erhalten bleiben.

Wir haben also zwei Polygon-Objekte: einen Stamm mit Ästen und die Blätter als Ganzes. Es ist natürlich auch möglich, das Blattwerk in mehrere Objekte zu unterteilen, die wir getrennt beeinflussen könn(t)en. Jetzt erzeugen wir eine Ebene, sie darf ruhig ausreichend unterteilt sein, das kommt der späteren Kollisionserkennung entgegen, aber bitte nicht übertreiben; es ist nicht so, dass wir ein Kantennetz erzeugen sollen, durch das kein Partikel mehr hindurchkann, ebenso wenig wie ein Milliarden Polys schweres Mesh, dicht genug ist, um keinen Strahl beim Raytracing hindurchzulassen ;) Diese Ebene wird unter dem Baum so platziert, dass sie als Boden dienen kann. Nicht vergessen, sie mit „C“ in ein polygonales Objekt umzuwandeln, sonst funktioniert es nicht.

0001Bilder

0002Bilder

Man nehme...

Bevor wir es vergessen, erzeugen wir jetzt ein Particle-Geometry-Objekt. Nur wenn es in der Szene ist, werden Partikelgeometrien angezeigt und auch gerendert. Das Objekt hat einen grünen Haken im Objektmanager. Wenn wir das Objekt damit abschalten, werden statt der Partikelgeometrien nur ihre Positionen angezeigt.
An welcher Stelle der Hierarchie das Objekt steht ist unerheblich, auch ob wir Partikel oder Modifier diesem unterordnen oder nicht.

0003Bilder

Jetzt erzeugen wir zwei Nullobjekte und nennen sie Wind und Gravitation. Sie bewirken vorerst noch nichts, aber wir werden sie später für die Schaltung brauchen.

0004Bilder

Wind und Gravitation wirken entlang der Z-Achse. Logischerweise drehen wir also unser Gravitationsobjekt so, dass seine Z-Achse nach „unten“ zeigt, in Richtung der negativen Y-Weltachse. Das Windobjekt drehen wir so, dass die Z-Achse dahin zeigt, wohin unsere Blätter abgetrieben werden sollen; für unser Tutorial kann es so ausgerichtet bleiben, wie es ist.

0005Bilder

Jetzt haben wir alle notwendigen Szenenbestandteile zusammen und können loslegen, TP zu quälen.

Partikelsturm im Blätterdach...

Xpresso-Zeit! TP wird in einem Xpresso-Fenster gemixt, also bekommt irgendein Objekt jetzt einen Xpresso-Tag. Ich habe mich für das Particle-Geometry-Objekt entschieden, aber auch das ist egal. Überlegen wir uns unser weiteres Vorgehen - einen Plan zu haben, ist immer eine gute Idee.
Wir wollen unser Blattwerk zuerst als Ganzes darstellen, dann soll entsprechend unserer Vorgaben ein Teil der Blätter zu Boden fallen.
Dazu gehen wir bei TP so vor: wir erzeugen ein Partikel mit dem Aussehen des Blattwerks. Dieses Partikel lassen wir in Fragmente zerlegen, die als separate Partikel weiterbehandelt und von Wind, Schwerkraft und anderen Faktoren beeinflusst werden.
Das Blattwerk-Partikel lassen wir uns von einem Pstorm-Node generieren. Dieser soll im Frame 0 genau ein Partikel mit dem Aussehen des Blattwerks an dessen Position und mit dessen Ausrichtung erzeugen.
Wir erzeugen dazu einen Time-Node (Xpresso/General), einen Is-Null-Node (Xpresso/Logic) und einen Pstorm-Node (Thinking Particles/TP Generator). Den Ausgang des Time-Nodes verbinden wir mit dem Eingang des Is-Null-Nodes, dessen Ausgang kommt an den von uns erzeugten On-Port des Pstorm-Nodes.

0006Bilder

Folgendes passiert:
Der Time-Node bezieht seine Zeitangabe aus der laufenden Animation. Bei Frame 0 ist die Zeit gleich Null. Wir könnten ebenso im Time-Node einen Frame-Port erzeugen, aber Time=0 ist eindeutig genug. Die Ausgabe des Time-Nodes füttert den Is-Null-Node mit der Information über den Moment, wo Frame 0 erreicht ist und liefert als Ausgang ein Boolsches „Wahr“. Dieses „Wahr“ schaltet den Pstorm-Node auf „On“ und nur in diesem Zustand kann er Partikel erzeugen. Jetzt stellen wir die Parameter des Pstorm-Nodes im Attribute-Manager (AM) ein. Wichtig ist der Birth-Type „Shot“ mit dem Shot-Wert 1. Es wird also im Moment der Aktivität genau ein Partikel erzeugt. Bei Life tragen wir eine ausreichend große Zahl ein, wir benutzen 750 (Frames), so garantieren wir, dass das Blattwerk während unserer Animation nicht plötzlich verschwindet. Die Size setzen wir auf 100(%), schließlich soll das Partikel eine 1:1-Kopie des Originals sein. Speed muß unbedingt 0 sein, sonst driftet das Blattwerk ohne weiteres Zutun als Ganzes davon, auch alle anderen Werte stellen wir auf 0.

0007Bilder

Jetzt legen wir fest, wo das Partikel erzeugt werden soll. Dazu ziehen wir das Objekt Blätter aus dem Objekt-Manager (OM) ins Xpresso-Fenster. Zwei Ausgabeports müssen wir anlegen, Global-Position und Global-Matrix. Den ersten verbinden wir mit der Emitter-Position des Pstorms, den zweiten mit dem Emitter-Alignment-Port, den wir anlegen müssen.

0008Bilder

Nun folgt ein Pshape-Node(TP-Standards), den wir an den Ausgangsport Particle-Birth des Pstorms hängen (auch erst erzeugen).
In diesen ziehen wir aus dem OM erneut das Objekt Blätter. Dann schalten wir im OM dieses Objekt auf komplett unsichtbar (zwei rote Punkte), die Anzeige wird jetzt TP selbst übernehmen.

0009Bilder

0010Bilder

Mit Play schauen wir uns die Animation an, bisher recht bewegungslos, aber korrekt. Nicht vergessen, nach Stop wieder auf Frame 0 zurückzuspulen, eine Simulation muß immer vollständig durchlaufen, wenn wir sie richtig beurteilen wollen.

It's a kind of magic...

Ordnung muß sein. Wir wollen (müssen!) unsere Partikel in Gruppen unterteilen, damit alles korrekt ablaufen kann. Verschiedene Gruppen können auf verschiedene Ereignisse reagieren. Auf das Blattwerk soll z.B. keine Gravitation wirken, auf die erzeugten Blätter schon. Wir öffnen die Thinking-Particles-Settings, dort finden wir eine Gruppe, die All heißt. Wenn wir sie selektieren und rechts anklicken, können wir per „Add“ weitere Gruppen hinzufügen. Das tun wir, die neue Gruppe nennen wir Blattwerk. Wenn wir einmal dabei sind, erzeugen wir noch zwei weitere Gruppen, die unter All alle auf gleicher Ebene liegen müssen. Eine Gruppe nennen wir Blätter, die dritte Boden.

0011Bilder

Als erste Aktion danach erzeugen wir einen Pgroup-Node (Thinking Particles/TP Standard) und hängen ihn ebenfalls an den Particle-Birth-Ausgang des Pstorm-Nodes. Aus dem Thinking-Particles-Settings-Fenster ziehen wir die Gruppe Blattwerk in diesen Node. Damit landen alle Partikel, die der Pstorm-Node erzeugt, in dieser Gruppe; wir erinnern uns, es sollte nur eines sein. Wenn wir die Animation mit Play vorschauen, sollte im Fenster der TP-Settings neben Total genau dieses eine Partikel stehen, wenn wir die Gruppe Blattwerk aktiviert haben, auch neben Tree und Group. Wählen wir eine andere, noch nicht belegte Gruppe aus, sollte dort die 0 stehen, logisch, weitere Partikel gibt es ja noch nicht.

0012Bilder

Eine Kleinigkeit erledigen wir noch schnell: wir stellen in den Project-Settings den Wert für Maximum auf 750. Das sollte genügen. Die Framerate stellen wir, falls noch nicht geschehen, auf landestypische 25.

0013Bilder

Marmor, Stein und Eisen bricht...

Lassen wir es Blätter regnen. Um TP klarzumachen, dass wir mit der Gruppe Blattwerk arbeiten wollen, erzeugen wir einen P-Pass-Node. Die korrekte Gruppe ziehen wir aus dem TP-Settings-Fenster auf diesen Node (alternativ können wir ihn auch ins Namensfeld im AM ziehen; der AM bietet sich fast für alle Aktionen an, nur manchmal ist ein direktes Arbeiten im Xpresso-Fenster eben schneller). An den P-Pass-Node hängen wir einen Pfragment-Node an, an dessen Born-Particle-Ausgang einen weiteren Pgroup-Node, in den wir die Gruppe Blätter ziehen. Eines scheint uns sofort klar – das Partikel der Gruppe Blattwerk wird hier zerstückelt, heraus kommen neue Partikel, die einer neuen Gruppe, Blätter, angehören. Was passiert? Dazu klicken wir den Node Pfragment an und schauen uns im AM die Parameter an.

Ein entscheidender Wert, dazu auch noch der einzige, der von uns manuelle Keys erhalten wird, ist der Threshold. Dieser Schwellwert gibt an, wie „sehr“ ein Gesamtpartikel zerbröselt werden soll. Eine 1 bedeutet völlige Unversehrtheit, eine 0 die totale Zerstörung (entsprechend der weiteren Vorgaben, wie wir gleich noch sehen werden).
Wir setzen einen Key bei Frame 0 mit dem Wert 1 und bei Frame 450 mit dem Wert 0.75. Das bedeutet, dass wir etwa 25% der Blätter zu Fall bringen wollen.
Ein Wert von 75% für Variation soll dafür sorgen, dass die Blätter unregelmäßig fallen. From/To ist Geschmackssache, es gibt die Achse und die Richtung an, auf der die Fragmentation stattfinden soll, bei -Y to +Y und einer Variation von 0% würden die Blätter brav von „unten“ beginnend herabfallen und sich nach „oben“ durcharbeiten.

 Thickness kommt zweimal vor, einmal für die erzeugten Partikel, einmal für die verbleibende Oberfläche. Da unsere Blätter mit großer Wahrscheinlichkeit im Ausgangsobjekt ohne Dicke am Baum hängen, stellen wir je 0% ein.

Speed ist mit 0% korrekt, wir wollen ja die externen Kräfte wirken lassen. Lifespan 750... wir brauchen die Blätter bis zum Schluß. Wie erklären wir Pfragment, dass es unser Gesamtobjekt in Blätter zerlegt und nicht willkürlich in Polytrümmer?
Besteht jedes Blatt aus einem Polygon, ist die Sache einfach. Wir wählen als Typ(e) „Single Faces“ und die Sache läuft.
Bei zusammengesetzten Polygonblättern hilft nur schätzen, tricksen und beten. Der Typ(e) „Smooth and Distance“ hat die Parameter Angle und Radius. Wir lassen den Wert für Radius bei 50%, der Angle-Wert muß mit großer Wahrscheinlichkeit erhöht werden, notfalls bis zum Maximalwert. Wir sollten durch Probieren aber erreichen, zu 99% unzerstückelte Blätter zu erhalten. Bei mäßig gebogenen Blättern sollten selbst die voreingestellten Werte gute Ergebnisse erzielen.
Die Checkbox bei Alignment-Correction bekommt einen Haken! So stellen wir sicher, dass die erzeugten Fragment-Partikel eine einheitliche Achsenausrichtung haben. Warum, das werden wir merken, wenn wir sie flach auf dem Boden liegen haben wollen.

 

0014Bilder

0015Bilder

Bevor wir den nächsten Testlauf starten (eventuell zum Werteeinstellen), erzeugen wir einen P-Pass-Node, der die Gruppe Blätter zugewiesen bekommt und einen Pgravity-Node, in den wir das Objekt Gravitation (das Nullobjekt aus dem OM!) ziehen. Diese Nodes werden verkabelt.
Jetzt kann der Testlauf starten. Bitte das Sichern nicht vergessen; falls bei größeren Partikelmengen ein „Freeze“ eintritt, ärgert man sich doch sehr. Die Partikel fallen wie Steine vom Baum. Besser als nichts. Wenn die Blätter als Blätter (also „richtig“ abgetrennt) fallen, gehen wir ans Feintuning.
Besser sehen wir, was passiert, wenn wir den Baumstamm vorübergehend auf unsichtbar schalten.

The way it's meant to be...

Beginnen wir mit einem ersten Tuning der Gravitation. Wenn die Blätter zu schnell fallen, dann ist die Gravitation zu hoch. TP verwendet keine physikalisch übertragbaren Werte, die voreingestellte 100 ist einfach nur als Ausgangswert zu sehen, den wir anpassen müssen. Experimentieren wir und einigen wir uns auf ein vorläufiges Endergebnis von 20.
Irgendwie fallen die Blätter immer noch sehr lieb- und leblos herab. Wir brauchen mehr Faktoren, die die Flugbahn beeinflussen. Eine Null für den Wind haben wir schon in der Szene, jetzt müssen wir TP nur mitteilen, dass dieser Wind auch wehen soll. Analog zur Gravitation erzeugen wir einen Pwind-Node und ziehen die Wind-Null auf ihn. Die Windstärke (wieder im AM) ändern wir auf 10, die Turbulenz auf 15 und die Frequenz auf 2. Wieder experimentieren wir, andere Werte je nach Wunschvorstellung sind ebenso korrekt. Auch können wir die Wind-Null drehen und neigen, wie es uns passend erscheint.
Fallende Blätter „schwingen“, dafür erzeugen wir einen Pbubble-Node. Die Amplitude (die „Weite“ der Schwingung) müssen wir unserer Szenengröße anpassen, ebenso die Geschwindigkeit. Die Blätter fallen nun nicht mehr steinartig herab, wir tunen so lange, bis es uns gefällt. Das macht jeder etwas anders, deshalb nenne ich keine Werte.
Etwas fehlt noch – die Blattdrehung. Dazu fügen wir, wie gehabt, an den P-Pass-Node einen Pspin-Node an. Wieder schauen uns viele Parameter sehnsüchtig an - machen wir sie glücklich. Evaltime beschreibt, wie lange es dauert, bis ein Partikel aus der Ruhe heraus beginnt, sich zu drehen. Würde das Partikel abrupt in Drehung geraten, würde uns die gewohnte „Trägheitswirkung“ fehlen. Dann kommt der Parameter Time, der festlegt, wie lange eine Umdrehung dauert. Auch hier schauen wir uns im Editor an, wie es aussieht und tunen, bis es uns gefällt.

0017Bilder

Der Apfel fällt nicht weit vom Stamm...

Jetzt schalten wir den Stamm wieder sichtbar und starten eine erneute Animationsvorschau. Wir stellen fest, dass die Blätter ungeniert Äste und den Stamm durchdringen; das wollen wir nun ändern.
Wir erzeugen einen Deflector-Node und hängen ihn an den P-Pass-Node. Dann ziehen wir das Stamm-Objekt aus dem OM darauf.
Der Deflector-Type soll Geometry sein. Jetzt werden Kollisionen so genau wie möglich erkannt, da sie auf Polygonbasis abgefragt werden. Bei Bounce tragen wir einen niedrigen Wert ein, z.B. 2%, die Blätter sollen bei der Kollision mit dem Stamm nicht hüpfen. Alle anderen Werte sind bei 0% gut eingestellt, aber wie immer gilt, Versuch macht kluch... Nun fallen die Blätter natürlich immer noch durch den Boden; natürlich hilft auch hier ein Pdeflector-Node. Diesmal ziehen wir das Boden-Objekt darauf. Alle Werte, auch Bounce, wollen wir auf 0% stellen, der Deflector-Type ist wieder Geometry.

0019Bilder

0018Bilder

Ein Tipp noch:
Wenn wir einen Pfriction-Node an den P-Pass-Node hängen, haben wir eine schnelle Möglichkeit, die Bewegung der Blätter zusätzlich und unkompliziert zu bremsen oder zu beschleunigen. Eine gute Sache, die mit einem Node ein gruppenweites Tuning ermöglicht.
Wir wären fertig, wenn sich die Blätter am Boden nicht so „flippig“ verhalten würden.

Partikel, wechsel Dich...

Um die Blätter, die den Boden erreicht haben, ruhigzustellen, brauchen wir eine neue Partikelgruppe. Erstellt hatten wir sie schon, sorgen wir nun dafür, dass die richtigen Partikel auch zum richtigen Zeitpunkt dort landen.
Wir erzeugen einen Pgroup-Node (dem wir die Gruppe Boden zuweisen) und hängen ihn an den Pdeflector-Node des Bodens, direkt an den Ausgabeport Event, den wir mit dem Eingabeport On verbinden. Immer, wenn jetzt ein Blatt den Boden erreicht und eine Kollision auslöst, wird ein Ereignis gemeldet und der Pgroup-Node aktiviert. Um festzulegen, welches Partikel welcher Gruppe den Gruppenwechsel durchführen soll, wird der Ausgabeport des P-Pass-Nodes mit dem TP-Particle-Port des Pgroup-Nodes verbunden.

0021Bilder

Wir verschaffen uns einen besseren Überblick. In den Thinking-Particles-Settings klicken wir eine Gruppe nach der anderen rechts an, öffnen die Settings und weisen verschiedene Farben zu. Jetzt sehen wir deutlich, wie die Blätter beim Aufprall auf dem Boden ihre Farbe und damit ihre Gruppe wechseln. Das Particle-Geometrie-Objekt könne wir zur beschleunigten Ansicht abschalten, die Farben verschaffen uns den Überblick.

0020Bilder

Die Blätter allerdings sind immer noch nicht ruhiger geworden und richtig flach zu liegen haben sie auch noch nicht gelernt.

Ruhe im Glied!

Wir brauchen eine neuen P-Pass-Node, dem wir die Boden-Gruppe zuweisen. An diesen hängen wir jetzt einen Palignment-Node an. Er wird dafür sorgen, dass sich die gefallenen Blätter am Boden ausrichten. Mit Laziness bestimmen wir, wie lange es dauert, bis ein Partikel nach Gruppenbeitritt flachgelegt ist. Laziness 0 würde eher wie schneller Biertod aussehen, ein Wert von 0.5 schien mir hier angemessen. Die Werte für Source und Type muß man ausprobieren, bis man die Partikel richtig liegen hat. Wichtig war nur, dass wir schon im Pfragment-Node diese Alignment-Box angehakt hatten, um eine definierte Achsenlage für jedes Partikel zu erhalten.

0023Bilder

0022Bilder

Je nach Moment der Kollision ist das Laub jetzt mehr oder weniger nah am Boden flach zum Liegen gekommen. Das kann nett 3D wirken oder auch negativ auffallen. Waren die bisherigen Nodes rein logisch setzbar, kommt jetzt ein wenig Mathematik der Grundstufe dazu.
An den P-Pass-Node für die Gruppe Boden hängen wir einen Pgetdata-Node, für diesen erzeugen wir einen Position-Port. So fragen wir für jedes am Boden liegende Blatt dessen Position ab. Das Ergebnis ist ein Vektor; uns interessiert nur die Y-Position, sprich, die Höhe über dem Boden. Ein Vectors2Reals-Node zerlegt uns den Vektor. An den Y-Ausgabe-Port hängen wir einen Compare-Node mit seinem Input-1-Port. Im Node stellen wir als Function „>“ ein, der Wert für Input-2 ist 0.5. Die Kollisionsebene ist bei Y=0. Wird ein Partikel bei einem Y-Wert größer als 0.5 gefunden, so ist der Wert am Output-Port des Compare-Nodes „wahr“. Ein Psetdata-Node beendet die Kette, wir brauchen drei Eingangsports – Particle, On und Position.

Den Output-Port des Compare-Nodes verkabeln wir mit dem On-Port, der Particle-Port bekommt eine Verbindung zum TP-Particle-Ausgabe-Port des P-Pass-Nodes für die Gruppe Boden.

0024Bilder

Die Schaltung weiß bisher also, wenn ein Partikel zu hoch ist; jetzt zur Korrektur. Wir erzeugen einen Math-Node und stellen die Operation von Add auf Subtract um. Der Y-Ausgabe-Port des Vector2Reals-Nodes wird mit dem oberen Input-Port des Math-Nodes verdrahtet. Als Input[2] tragen wir 0.5 ein, das heißt, die Höhe des Blattes wird, falls über 0.5 in Schritten von 0.2 reduziert, bis sie kleiner gleich 0.5 ist. So senken wir die Blätter alle Richtung Boden ab.
Ein Reals2Vector-Node komplettiert die Schaltung. X- und Z-Port bekommen wir direkt aus den X- und Z-Ports des Vectors2Reals-Nodes, da wir diese Werte ja nicht verändern wollen. Der Output des Math-Nodes ist der neue Y-Wert. Jetzt wird noch der Output des Reals2Vectors-Nodes mit dem Postions-Port des Psetdata-Nodes verbunden, fertig.

0025Bilder


Bis denne,
alles Gute...

Cinemike & DenSchub


DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Heraklit
  • 17.07.2013 - 12:09

Top Thema sehr gut aufgearbeitet, mein Kompliment.
Habe auch eine Schaltung (EXpresso) in der man den Wechsel der Laubfarbe
an den Kalender anbinden kann....einfach super

Portrait von css_fan
  • 15.09.2011 - 12:52

:D etwas schwerer als vorgestellt, aber sehr ansehnlich dargestellt:)

Portrait von andreasmulsow
  • 24.05.2010 - 17:02

sehr interessant, für grundlagen aber nicht ausführlich genug

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 15.01.2010 - 01:37

sehr sehr hilfreicher tut. vielen dank

Portrait von skyfox343
  • 29.11.2009 - 14:53

Sehr ausfürhlich leider hab ich keine tp ^^

Portrait von opecMonk
  • 06.08.2009 - 12:29

sehr ausführlich, so muss das sein

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 04.08.2009 - 17:01

danke für das ausführliche tut.

Portrait von Mtbler
  • 04.08.2009 - 03:26

Hier muß ich mayhardcastle recht geben.
LG Gerhard

Portrait von mayhardcastle
  • 03.08.2009 - 22:34

cinema 4d ist zwar ein großes buch mit sieben siegeln für mich , da ich mich eher im 2d bereich tummle, aber trotzdem hat mich das thema interessiert... und soweit ich das beurteilen ist das toll geschriebenes tutorial! daher 5 sterne, auch wenn ich nicht im geringsten nachvollziehen kann, ob das alles auch alltagstauglich ist ;0)

x
×
×