Anzeige
Tutorialbeschreibung

C.O.F.F.E.E. - Einstieg Teil 2

C.O.F.F.E.E. - Einstieg Teil 2

Dies ist der zweite Teil der kleinen Tutorial-Reihe zu der Programminternen Scriptsprache C.O.F.F.E.E. von Cinema 4D (Maxon).


Hallo und Willkommen zu meinem zweiten Tutorial hier auf PSD-Tutorials.de.

In diesem Teil geht es um:

Einfache Berechnungen
If-Anweisungen (wenn Objekt Position X größer als... usw.)
Umgang mit Matrizen (besser bekannt als Matrix (global/lokal))
Interaktion mit dem Layout von Cinema 4D 

Fangen wir einfach mal an.

Erstellt wieder ein Null-Objekt, markiert dieses und weist wie in Teil 1 einen C.O.F.F.E.E.-Tag zu.

Bilder


Wieder mal öffnet sich der Expression-Editor mit der "main()" -Funktion und den 
Parametern "doc" und "op". Öffnet im Anschluss noch die Konsole.

Bilder


Greifen wir wie gehabt erstmal auf die Positionen und die Rotation des Null-Objektes zu und speichern diese in zwei Variablen ab;

schreibt dazu:

var position=op->GetPosition();
var rotation=op->GetRotation();



Der Einfachheit halber addieren wir die X- Position zur B-Rotation (also Z.) 
(HPB = Heading, Pitch, Bank -> XYZ)
(Wer mehr darüber erfahren möchte, googelt einfach mal nach "Roll-Pitch-Yaw-Winkel " und/oder "Nick-Gier-Winkel").

In die nächste Zeile schreiben wir einfach mal:

println(rotation);

Schaut jetzt in Richtung Konsole und dreht das Null-Objekt auf der Z-Achse (B -Bank) um ca. 90°.
Wie ihr seht, steht in der Konsole "1.570..." statt 90°.

Bilder


Warum ist das so?
-> Es sind Radianz-Werte, die wir umrechnen können in Grad (°).

Zum Umrechnen können wir einfach den Radianz-Wert mal (*) 180 und geteilt durch (/) pi (π) nehmen.
Schreibt dazu in den Expression-Editor:

println (180 * rotation / pi ); 

Den Wert von PI (3,14159... ) können wir einfach mit dem Wort "PI" schreiben!

Benutzen wir jetzt den einfachsten Weg dafür, NUR die B-Rotation anzeigen zu lassen,
indem wir einfach " .z " (punkt Z) hinter das Wort "rotation" schreiben :)
Also:

println ( 180 * rotation.z / pi );

Nun wird nur der Z-Wert angezeigt:
[90.000000]

Bilder


Jetzt zur eigentlichen Berechnung:

var rechnung = ( 180 * rotation.z / pi ) + position.x ;
println (rechnung);


Um mit den Werten in der Konsole nicht durcheinanderzukommen, "deaktivieren" wir erstmal die Print-Anweisung:

// println ( 180 * rotation.z / pi );

Durch die zwei Schrägstriche ( // ) interpretiert Cinema es als Kommentar.

-> Kompilieren & Ausführen!

Verschiebt das Null-Objekt jetzt auf der globalen, also der X-Achse (lokal wäre es die Y-Achse) -> am Anfasser...


Bilder


Wer mag, kann das jetzt in eigener Regie auf ein neues Objekt übertragen :)

Weiter geht's mit der IF-Anweisung:

Für größere "Scripte" mit mehreren Objekten ist es sinnvoll zu überprüfen, ob ein Objekt gefunden wurde oder ggf. überhaupt z.B. ein Polygonobjekt ist!

Dazu kann man zum Beispiel einen Text "Objekt nicht gefunden" oder Ähnliches anzeigen lassen :).

Erstellt eine neue Szene und fügt ein Null-Objekt ein (siehe oben) und einen Würfel.

Bilder


Fügt dem Null-Objekt wieder einen C.O.F.F.E.E.-Tag hinzu (siehe auch oben :) ).
Suchen wir erst einmal den Würfel und speichern diesen (...)

var cube = doc->FindObject("Würfel");

Nun überprüfen wir, ob der Würfel gefunden wurde:

if (cube != NULL)

(Wenn "cube" ungleich "NULL (leer)" dann: ...)
 
Es wird überprüft, ob sich "etwas" in der Variable "cube" befindet (welche ja nur durch ein Objekt namens "Würfel" befüllt sein kann).

Wenn dem "nicht" so ist (also NICHT leer!), dann soll ein Text erscheinen!

If (cube != NULL)
 { println ( " Ok, Objekt gefunden " , cube) ; }


Für den Fall, dass "cube" leer ist, benutzen wir "else" (ansonsten)

if (cube != NULL)
 { println ( " Ok, Objekt gefunden " ) ; }
else
 { println ( " Kein Objekt gefunden " ) ; }


Benennt den Würfel einfach mal um:

Bilder


Natürlich soll das Script nicht weiter ausgeführt werden, wenn das Objekt nicht gefunden wird; schreibt dazu einfach bei der "else"-Anweisung

else
 { println ( " Kein Objekt gefunden " ) ; return false ; }


und das Skript wird abgebrochen!

Diese "Abfrage" funktioniert natürlich in vielerlei Hinsicht.

Fragen wir Cinema 4D doch einfach mal, ob der "Würfel" ein Polygon-Objekt ist :)

if ( instanceof ( cube, PolygonObject ) )

Das heißt also:
Wenn das "Objekt" ein "Teil" eines Polygonobjektes ist (cube-> soll darauf geprüft werden!), dann...

println("Ok, es ist ein Polygon-Objekt");


else
 { println( " Konvertiere Objekt: " ) ; return false ; }


Wenn es also KEIN Polygonobjekt ist, dann zeige an: "Konvertiere Objekt" :) und beende das Script.
Man könnte es sich noch etwas einfacher machen, um zu wissen, welches Objekt man konvertieren soll, mit dem Befehl "GetName()".

Schreibt also:

else
 { println( " Konvertiere Objekt: ", cube->GetName() ) ; return false ; }


Alles so schön bunt ;)

Bilder


Hier das ganze Script noch einmal:

main(doc,op)
{
var cube=doc->FindObject("Würfel");
if (cube != NULL)
 { println ( " Ok, Objekt gefunden: " , cube) ; }
else
 { println ( " Kein Objekt gefunden " ); return false ; }


if (instanceof (cube, PolygonObject) )
 { println ( " Ok " ) ; }
else
 { println( " Konvertiere Objekt: ", cube->GetName() ) ; return false ; }


}


Aufgrund der Länge dieses Tutorials überspringe ich hier den Teil mit den Matrizen und komme gleich zur Interaktion mit dem Layout!


Öffnet eine neue Szene und erstellt einen Würfel

Bilder


und gebt diesem ein C.O.F.F.E.E.-Tag:

Bilder



Den Expression-Editor kann man erst einmal auf die Seite schieben :), sodass man freie Sicht auf die Szene hat.
Klickt im Attribute-Manager auf den Tab-> "Koordinaten" und setzt einen Key-Frame für die X.Position.

Bilder


Geht anschließend zu Frame 50 (oder 100, oder 150; vollkommen egal), verschiebt den Würfel auf X = + 200 und setzt wieder einen Key-Frame (bei X).

Nun zu C.O.F.F.E.E. ->
Öffnet den Expression-Editor wieder und fragt die aktuelle Position des Würfels ab, mit:

var position=op->GetPosition();

(diesmal "op", da der Würfel den C.O.F.F.E.E.-Tag trägt ;) )
Jetzt kommt wieder eine "IF – Anweisung":

if (position.x >= 100)

Nun öffnet ihr noch den Befehls-Manager (Fenster -> Layout -> Befehls-Manager)

Bilder


und gebt bei "Filter: Name" den Befehl: "Stop" ein.
Zieht diesen Befehl einfach in den Expression-Editor (Drag&Drop): 

Bilder


Es sollte dann "CallCommand(12002);" im Editor stehen.
Setzt diesen Befehl noch in geschweifte Klammern ( { CallCommand(12002); } )


main(doc,op)
{
var position=op->GetPosition();

if (position.x >= 100)
 {
  CallCommand(12002); 
 }
}


Sobald der Würfel an der Position X=100 angekommen ist, wird der "Stop"-Befehl ausgeführt und die Animation wird gestoppt (Achtung: Es kann vorkommen, dass das Script langsam ist, d.h. dass der Würfel z.B. ab Position 100.5*** erst stoppt.  - Übertreibt es auch nicht mit der Experimentierfreude: Absturz!)
Man kann somit eine Key Positions-Animation machen und alle 10 Frames z.B. einen Würfel an der aktuellen Position erstellen.

-> Im nächsten Tutorial  mehr dazu :)

Das war's dann auch schon wieder mit dem zweiten Teil der Tutorial-Reihe!
Im dritten Teil:

-Wie versprochen: Matrizen und Vektoren
-Kreisbeschreibung mit sin und cos
-C.O.F.F.E.E. in und um Xpresso
-C.O.F.F.E.E.-Anwendungsbeispiel (...)


Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von Lala_Ghost
  • 20.09.2013 - 16:06

Super! Danke, ich muss die Basics auch mal lernen! :)

Portrait von graffiti
  • 25.01.2010 - 16:26

Hallo errare,

ich finde das Tutorial sehr gut und hoffe noch auf reichlich Fortsetzungen. Im ersten Teil ist leider ein kleiner Fehler. Die Html Version und die PDF-Version sind verschieden.
HTML:
Jetzt weiß Cinema natürlich nicht “Welche Position denn?“ Also müssen wir diese gleich als Parameter mit übergeben:

cube->SetPosition(position);

(also vom Würfel!)

PDF:
Jetzt weiß Cinema natürlich nicht “Welche Position denn?“ Also müssen wir diese gleich als Parameter mit übergeben:

cube->SetPosition(cube);

(also von cube!

Gruß graffiti

Portrait von errare
  • 25.01.2010 - 16:43

Der Fehler in der HTML Version wurde bereits Korrigiert. Über die PDF habe ich keinen Einfluss!
-Danke

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 25.01.2010 - 14:11

Ich werd noch ein großer Fan von coffee :-)
Wieder ein schöner Tutorial!

x
×
×