Folgendes Tutorial entstand als Lösung zum hier (http://www.3dmaxforum.net/forum/3ds-max/3ds-max-animation/16543-kolbenbewegung.html) geschilderten Problem.
Die benötigte Datei findet sich im Anhang.
Dieses Tutorial erfordert Grundkenntnisse über das Arbeiten mit Verlinkungen, Controllern und Constraints, ist also für Anfänger nicht geeignet.
Als erstes erzeuge ich einen Dummy in der Größe der gesamten Apparatur und platziere ich mittig. Größe und Platzierung sind relativ egal und müssen nicht sehr akkurat sein.
Diesen Dummy nenne ich masterControl.
Danach baue ich eine Hierachie über Verlinkungen auf, die alle nichtbeweglichen Teile (Layer:Rad_01, Layer:Rad, Layer:Schraube_01)umfasst. Ob diese direkt an den Dummy gelinkt werden oder untereinander, ist Geschmackssache, ich benutze als Parent den Dummy, weil es schneller geht.
Das Objekt Layer:Rad_02 linke ich an das Objekt Layer:Schraube_01
Anschliessend kreiere ich 3 Point Helper und platziere jeweils eins am Pivot der Objekte Layer:Rad_03, Layer:Schraube_02 und Layer:Stange.
Point01, welcher sich an Layer:Rad_03 befindet wird an Layer:Rad_02 gelinkt, Point02, der sich bei Layer:Schraube_02 befindet, linke ich an Layer:Rad_01.
Weiter geht’s mit dem Aufbau der Pleuelmechanik: Layer:Rad_03 wird per Position Constraint an Point01 gebunden, Layer:Schraube_02 auf die gleiche Art an Point02.
Die Ausrichtung erfolgt über Look-at-Constraints.
Layer:Rad_03 auf Point02 und Layer:Schraube_02 auf Point01. Gegebenfalls muss die Ausrichtung mit ‘Keep Initial Offset’ zurückgesetzt werden.
Bei beiden Look-at-Constraints ändere ich den Upnode von ‘World’ auf ‘masterControl’.
Verdreht sich das Objekt dabei, kann dieses über das Feld ‘Source/Upnode Alignment’ korrigiert werden.
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15552d1222717099-kolbenhub-per-scrip-controller-upnode.jpg
Wenn bis hierhin alles richtig gemacht würde, kann man das System über den Dummy ‘masterControl’ frei im Raum drehen und bewegen.
Jetzt der schwierigere Part.
Es gilt, die Bewegung von Layer:Rad_03 in eine Senkrechtbewegung von Layer:Stange umzuwandeln. Ich habe mich für einen Script-Controller entschieden, der über ein intersectRay() die Position von Point03 steuern wird, an den dann Layer:Stange verlinkt wird.
Zum intersectRay: intersectRay
() ist ein Scriptbefehl, mit dem von einem Punkt aus in eine definierte Richtung ein Strahl ausgesandt wird.
Trifft dieser Strahl auf ein Objekt , gibt er die Position des Treffpunktes als Point3 [x y z] zurück.
Mehr dazu in der MaxScript-Dokumentation.
Als erstes benötigen wir den . Lesen wir im Script-Manual unter Ray nach, finden wir folgendes:
—Zitat—
ray
Returns a new ray with given position and direction vector
as ray
Takes a scene object that has a target, such as a tape measure or a target camera and returns a ray from the object to the target.
—Zitatende—
Der Einfachheit halber benutzen wir einen Tapehelper. Beide Elemente des Tapehelpers werden an Point03 ausgerichtet, das Tape selbst verschieben wir auf seiner z-Achse ein Stück nach oben, das Target ein stück nach unten und verlinken beide an den Dummy ‘masterControl’.
Das wäre unser Ray, fehlt noch Nummer zwei, unser interSect Node.
Als Node benutzen wir ein einfaches Plane, das in etwa den Dimensionen des Pleuels’Layer:Rad_03′ entspricht und verschieben dessen Pivot an einen der beiden schmalen Ränder. In den Object Properties setzten wir dieses Plane auf nicht renderfähig(Haken bei ‘Renderable’ raus), da es im Rendering nicht sichtbar sein soll.
Ansschliessend per Position- und Look-at-Constraint an das Pleuel verbunden. Das geht entweder von Hand oder per Copy/Paste der entsprechenden Controller. Die erste Möglichkeit wird bereits weiter oben für Layer:Rad_03 beschrieben, der zweite Weg ist eleganter und schneller.
Zum Kopieren der Controller öffnen wir den Curveeditor und suchen das Objekt Layer:Rad_03. Interessant für uns ist der Transform-Track. Dieser wird kopiert
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15549d1222717099-kolbenhub-per-scrip-controller-copy.jpg
und anschliessend an gleicher Stelle für das Objekt Plane01 eingefügt.
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15550d1222717099-kolbenhub-per-scrip-controller-paste.jpg
Sollten Tape/Tape.target in der Topansicht nicht auf Plane01 liegen, ist dieses zu verbreitern.
Nun zum eigentlichen Script-Part:
Wir wählen Point03 aus und weisen dem Position-Controller im Motion Tab einen Position Script Controller zu.
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15547d1222717099-kolbenhub-per-scrip-controller-assign_1.jpg
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15548d1222717099-kolbenhub-per-scrip-controller-assign_2.jpg
Ins Expressionfeld geben wir folgenden Code ein
Code:
———
r = $Tape01 as ray
tp = interSectRay $Plane01 r
tp.position
———
Bild: http://www.3dmaxforum.net/forum/attachments/3ds-max/3ds-max-lehrgaenge/15551d1222717099-kolbenhub-per-scrip-controller-script_controller.jpg
Mit ‘r = $Tape01 as ray’ legen wir unser Tape01 als fest und geben diesem gleichzeitig den namen ‘r’.
In der Zeile ‘tp = interSectRay $plane01 r’
berechnen wir den Schnittpunkt von Ray und Plane01
und mit der Zeile
‘tp.position’
übergeben wir die Position von tp an den Scriptcontroller für die Position von Point03.
Bleibt nur noch das Verbinden von ‘Layer:Stange’ mit Point03 – wer es bis hier geschafft hat, kriegt das auch noch allein hin.
Es empfiehtlt sich, alle Teile bis auf den Dummy zu freezen, insbesondere die Postionen von Tape01 und Tape01.Target innerhalb dieser Anordnung sind extrem wichtig.
Continue reading " Animation Kolbenhub per Script-Controller "