Anzeige
Tutorialbeschreibung

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

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

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


Hallo und willkommen zumvierten Tutorial zu C.O.F.F.E.E. hier auf PSD-Tutorials.de.

In diesem Teil geht es um:

- Distanzen von 2 Objekten ermitteln und Objekte darauf platzieren
- Kugelstoßpendel (Newtonpendel; nur Funktion, kein Modell!)
- PlugIn-Scripts (Interne PlugIns mit dem Script-Editor)

Wie gehabt: fangen wir an!

Erstellt ein neues Null-Objekt, 2 Würfel und eine Kugel.

Legt die Grundkörper (Würfel, Kugel) als Unterobjekt zum Null-Objekt und heftet dem Null-Objekt einen C.O.F.F.E.E.-Tag an.

Bilder

Wir wollen also ein Objekt (die Kugel) so positionieren, dass diese genau in der Mitte der zwei Würfel liegt.

Dazu benötigen wir natürlich die Positionen der Würfel; diese lesen wir per Matrix aus.

Aber zuerst müssen wir noch die Würfel selbst „finden“.

Das Null-Objekt ist unser op, die Würfel sind unterhalb (hierarchisch darunter); an Unterobjekte kommt man mit dem Befehl ->GetDown(). Wenn man das allerdings so belassen würde, hätten wir die Kugel...

Wir wollen aber von der Kugel aus nächste Objekt: Mit GetNext(), dann noch die Globale Matrix und daraus die Positionen (V0).

Schreibt also in das Script:

main (doc, op)
{
var obj_1 = op->GetDown()->GetNext()-GetMg()->GetV0();
}

das Ganze noch angewendet für den zweiten Würfel:

main (doc, op)
{
var obj_1 = op->GetDown()->GetNext()->GetMg()->GetV0();
var obj_2 = op->GetDown()->GetNext()->GetNext()->GetMg()->GetV0();
}

Nun noch die Kugel:

main (doc, op)
{
var obj_1 = op->GetDown()->GetNext()->GetMg()->GetV0();
var obj_2 = op->GetDown()->GetNext()->GetNext()->GetMg()->GetV0();
var sphere= op->GetDown();
}

Man könnte das Ergebnis natürlich in einer separaten Variablen schreiben, oder eben direkt in den Befehl

->SetPosition( „Berechnung“ ).

Zur Berechnung:


Vielleicht erinnert sich noch einer an die Grund-/Haupt-/Real-Schule (was auch immer besucht wurde), in der man seinen Notendurchschnitt errechnet hat:

Note Mathe: 1

Note Physik : 3

Note Engl.: 5 (^^)

1+3+5 / 3 = 3

Hier funktioniert das nicht anders:

main (doc, op)
{
var obj_1 = op->GetDown()->GetNext()->GetMg()->GetV0();
var obj_2 = op->GetDown()->GetNext()->GetNext()->GetMg()->GetV0();
var sphere= op->GetDown();
sphere ->SetPosition( ( obj_1 + obj_2 ) / 2 );
}

Verschiebt nun einen der beiden Würfel:

Bilder

Bilder

Das Ganze funktioniert natürlich auch mit mehr Objekten:

sphere->SetPosition( obj_1 + obj_2 + obj_3 + obj_4 ) / 4 ) ;

Kugelstoßpendel (Newtonpendel)

Ich werde hier nur erklären, wie man das Pendel zum „Pendeln“ bringt (mit SIN- funktion : ) )

Werde also nicht erklären, wie man ein solches baut ^^

Beginnt einfach mit einem Linear-Spline und setzt drei willkürliche Punkte.

Bilder

Wechselt nun in den Struktur- Manager und setzt die Positionen gemäß dem Screenshot:

Oder importiert das:

Point X Y Z

0 0 0 300

1 0 -500 0

2 0 0 -300

Als ASCII-Code (kopieren, in *.txt speichern).

Bilder

Erstellt nun eine neue Kugel und setzt deren Position auf Y = -500.

Erstellt ein neues Null-Objekt (Position muss auf 0,0,0 liegen) und ordnet das Spline und die Kugel diesem unter.

Dupliziert das Null-Objekt (mit Unterobjekten) ca. 6 Mal auf X = 200 (RadiusKugel = 200).

Bilder

Verschiebt euer Null-Objekt nun unter das neu entstandene Null Objekt_copies und benennt die Unterobjekte in der Reihenfolge 1 – 6 (Doppelklick auf das erste Objekt -> Taste „1“; Pfeil nach unten -> Taste „2“ usw., zum schnelleren Umbenennen).

Fügt dem Null Objekt_copies nun einen C.O.F.F.E.E.-Tag zu.

Bilder

Nun brauchen wir wie auch im vorherigen Tutorial 3 Variablen:

-frame

-distance

-speed

Schreibt also in das Script (Expressions Editor)

main (doc,op)
{
var speed = 0.2;
var distance = 1;
var frame = doc->GetTime()->GetFrame(doc->GetFps());

}

Nun “finden” wir noch die erste und letzte “Kugel”:

var obj_1 = doc-> FindObject("1");

var obj_5 = doc-> FindObject("6");

nun noch 2 Vektoren: in dem einen wird die SIN-Kurve berechnet und im anderen die Rotation wieder auf Null gesetzt:

var vec_1 = vector(0,0, sin(frame*speed)/distance);

var vec_6 = vector(0,0,0);

Nun die Theorie:

-Sin soll auf “1” angewendet werden

-Wenn 1 Bank >= Null (Stoß an 2) soll sin auf 6 weitergeführt werden; 1 = 0

-Wenn 6 Bank <= Null (Stoß an 5) soll sin wieder zurück an 1; 6 = 0

Wer aufgepasst hat -> „Wenn, dann“ (also if / else)

Schreibt in das Script:

if ( vec_1.z >= 0 ) // nicht vergessen [punkt]. Z

        {
                       obj_1->SetRotation(vec_1);
                       obj_6->SetRotation(vec_6);
        }

else
        {
                       obj_1->SetRotation(vec_6);
                       obj_6->SetRotation(vec_1);
        }

Bilder

Bilder

Script Plugin:

Ich bin es manchmal leid, immer wieder ein und dieselbe Aktion durchzuführen: beveln!

Erstellen wir doch einfach ein kleines Script, das diese Aktion per „Knopfdruck“ mit ein paar Parametern erledigt.

Öffnet dazu den Script-Editor:

Bilder

Erstellt ein neues Script und benennt es „Bevel 0,1“ ( 0 [Komma] 1 )!

Bilder

Nun erst einmal zu all den netten Befehlen, auf die wir zugreifen müssen, um die Werte zu definieren.

Öffnet dazu den Ordner (in Windows/Mac, was auch immer), in dem CINEMA 4D installiert wurde

(Standard: C:ProgrammeMaxonCinema 4D R*** ).

(Oder Rechtsklick → Dateipfad öffnen (Vista); Rechtsklick → Eigenschaften → Ziel suchen (XP)).

Wechselt nun noch in den Ordner resource → modules → modeling → res → description

Und sucht die HEADER-Datei „toolbevel.h“ und öffnet diese mit dem Editor eurer Wahl (irgendein Text – Editor).

Bilder

Die Befehle selbst sind im Grunde selbsterklärend und benötigen hier keine nähere Erläuterung ;) (oder..?)

Markiert die Befehle:

MDATA_BEVEL_OFFSET2

MDATA_BEVEL_SUBDIVISION

Kopiert diese Textteile und fügt sie in das „Bevel 0,1“-Script in den Script-Editor von CINEMA 4D

MDATA_BEVEL_OFFSET2 -> der Befehl für den “InnerOffset” des Bevel-Tools

MDATA_BEVEL_SUBDIVISION -> der Befehl für die “Unterteilung” des Bevel-Tools

Bilder

(…BEVEL_OFFSET1 wäre die Extrusion vom Extrude-Tool)

Um diese zwei Befehle an das Bevel-Tool senden zu können, benötigen wir einen „Container“, in den man das Ganze „hineinwerfen“ kann. Oftmals liest man in anderen Scripts, dass diese neuen Container einfach in einer Variable „bc“ gespeichert werden; das machen wir jetzt auch einfach.

Schreibt an erster Stelle des Scripts:

var bc = new(BaseContainer);

Bilder

Werfen wir die Befehle in den Container:

bc ->SetData(MDATA_BEVEL_OFFSET2);
bc ->SetData(MDATA_BEVEL_SUBDIVISION);

Wenn Ihr das Script jetzt ausführen lasst, kommt es zu einem Fehler, da das Script noch Parameter für die Befehle benötigt:

bc ->SetData(MDATA_BEVEL_OFFSET2,  0.1);
bc ->SetData(MDATA_BEVEL_SUBDIVISION,  0);

Der Inner Offset ist somit auf den Wert von 0.1 eingestellt und die Subdivision (erst mal) auf Null (0)

Nun kommt der einfache Teil:

Um die Werte an das „Modeling- Bevel-Tool“ zu senden, benutzt man den „SendModelingCommand“;

welchen? -> „Modeling Bevel Tool“;

Wo und an was? -> doc(ument) und op (aktives Objekt) ->

Werte? -> bc (sind darin gespeichert)

anschließend noch -> Tu es! (MODYFY_EDGESELECTION)

Als Script heißt das dann:

SendModelingCommand(ID_MODELING_BEVEL_TOOL, doc, op, bc, MODIFY_EDGESELECTION);

Klickt auf “Ausführen”!

Bilder

Wenn die Konsole (Shift + F10) keine Fehler anzeigt, erstellt einen Zylinder, um das Script zu testen:

Bilder

Konvertiert den Zylinder („C“), wechselt in den Punkte-Modus, selektiert alle Punkte (Strg + A) und optimiert ihn (Rechtsklick im Editor -> Optimieren; und Klick auf „OK“).

Wechselt in den Kanten-Modus, wendet eine Loop-Selektion an (Taste: U + L) und selektiert die oberen Kanten (Edges).

Führt das Script erneut aus und siehe da, es funktioniert ;)

(hoffentlich...)

Speichert das Script (Wenn ihr wollt).

Nun könnt ihr euch noch ein nettes Icon erstellen (mit Photoshop z.B.). Oder nehmt das (nicht allzu gut gelungene) aus dem Szene Ordner.

Zieht das Icon (im Script- Manager) einfach per Drag&Drop ins Layout von CINEMA 4D. Und schon könnt ihr es voll einsetzten. Das war's dann auch schon wieder zu Teil 4 der kleinen C.O.F.F.E.E.-Reihe.

In Teil 5 kommt:

-for Schleifen
-Switch (CASE-Abfragen)
-Mit C.O.F.F.E.E. auf Materialien zugreifen
-Arrays in C.O.F.F.E.E.
-Einfache „Dialog-Box“ im Script-Manager


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

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

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 07.01.2011 - 17:57

Naja wie immer top Tutorial :)
Freue mich schon auf Teil 5 :P

x
×
×