[ Computeranimation ] Kapitel 5: Dependency Graph und MEL Prof. Dr. Stefan M. Grünvogel [email protected] Institut für Medien- und Phototechnik Fachhochschule Köln 5. Dependency Graph und MEL [Computeranimation] – p.1/41 Grundlegende Konzepte von Maya Ziel: Grundlegende Konzepte der Animation an Hand von Maya erläutern Fundamentale Konzepte tauchen in ähnlicher Weise in anderen Tools auf. Konzept verstanden ⇒ übertragbar auf andere Tools Dafür: Genaueres Verständnis von Maya notwendig 5. Dependency Graph und MEL [Computeranimation] – p.2/41 Maya Architektur Graphisches Interface m Interaktion durchführen ↓ wird übersetzt MEL Command Engine m Dependendy Graph MEL-Kommandos ↓ wird interpretiert Operation auf Dependency Graph 5. Dependency Graph und MEL [Computeranimation] – p.3/41 Datenfluss-Modell Prinzip von Maya: Ein Interface für Modelung, Animation, Rendering,... Grundidee: data flow model (Datenfluss-Modell) Was macht ein 3D-Programm eigentlich? Erzeugt Daten (z.B. 3D Modell, Animation) Daten werden durch Operatoren verändert Resultat der Operation sind wieder Daten (z.B. Pixel, ander Daten) Daten → Operator1 → Operator2 → . . . → OperatorN → Ergebnis Daten “fließen” durch die Operatoren 5. Dependency Graph und MEL [Computeranimation] – p.4/41 Der Dependency Graph Dependency Graph (DG) realisiert das Datenfluss-Paradigma in Maya (technisch: “push-pull”-Modell anstatt data flow) Repräsentation von Daten und Operatoren durch nodes (Knoten): erzeugen und manipulieren myemphalle Daten (Modelle, Dynamik, Animation,...) können miteinander verknüpft werden ◮ Netzwerk von miteinander verknüpften Knoten ◮ Konstruktion komplexer Operationen möglich Knoten vernetzen + MEL ⇒ vielfältige Möglichkeiten 5. Dependency Graph und MEL [Computeranimation] – p.5/41 Die Szene beinhaltet alle Modelle, Texturen, Lichter, Kameras,... Der Dependency Graph ist die Szene Maya-Datei: Sequentielle Abbildung des DG in einer Datei. 5. Dependency Graph und MEL [Computeranimation] – p.6/41 Darstellung des Dependency Graphen Hypergraph: Darstellung der Knoten und Verbindungen des DG 5. Dependency Graph und MEL [Computeranimation] – p.7/41 Datenfluss Beispiel: Animation einer NURBS-Sphäre entlang x-Achse Unsichtbar: time node. Output: Aktuelle Zeit curveAnim node (Animationskurve): Erzeugt mit aktueller Zeit einen Output-Wert nurbsSphere1_translateX.output transform node (Transformationsknoten): Output-Wert der Animationskurve wird nach nurbsSphere1.translateX übertragen 5. Dependency Graph und MEL [Computeranimation] – p.8/41 Knoten - Schematische Darstellung node input output Knoten besteht aus einem Typ, Attributen und einer compute Funktion compute() Attribute ◮ Halten Daten des Knoten ◮ Beispiel: • transform node: translateX • makeNurbsSpehere: radius compute() Funktion ◮ Symbolische Bezeichnung für uns! ◮ Wird im Hypergraph nicht dargestellt ◮ Aufgabe: Berechne neue Werte aus Input-Attributen und überweise Ergebnis in Output-Attributen. 5. Dependency Graph und MEL [Computeranimation] – p.9/41 Attribute Attribut = Name + Datentyp Ähnliche Attributen von Objekten Alle Daten sind in den Attributen von Knoten gespeichert node node node size: float pointA: compound x: float y: float z: float Einfaches Attribut Compound Attribut points: array [0] point: compound x: float y: float z: float [1] point: compound x: float y: float z: float [2] point: compound x: float y: float z: float Array Attribut 5. Dependency Graph und MEL [Computeranimation] – p.10/41 Die Compute-Funktion Funktion der Form output = compute(input0, ... , inputN) output, input1, ..., inputN: Attribute des Knotens Rechnung mit Daten seines Knotens und nicht mit Daten anderer Knoten “black box” Vorteil Implementierung von compute ist gekapselt kann ausgetauscht werden ohne Funktionalität zu ändern Wartung, Effizienz Nicht jeder Knoten muss compute-Funktion enthalten. 5. Dependency Graph und MEL [Computeranimation] – p.11/41 Abhängige Attribute In Maya: Keine formale Unterscheidung zwischen Input und Output-Attributen Alle Attribute halten Daten Interne Verknüpfung durch compute-Funktion im Knoten Beispiel: Volumen abhängig von Radius sphereSize: Input-Attribut volume: Output-Attribut sphereVolume sphereSize: float volume: float Berechnung mit compute()-Funktion: volume = compute(sphereSize) Intern: C++ Funktion attributeAffect(sphereSize, volume) 5. Dependency Graph und MEL [Computeranimation] – p.12/41 Abhängige Attribute Verknüpfung mehrerer Input und Output-Attribute boxMetrics width: float height: float depth: float areaOfTop: float volume: float areaOfTop = width * depth volume = areaOfTop * height areaOfTop = compute(width, depth) volume = compute(areaOfTop, height) Update-Mechanismus Berechnung volume hängt von areaOfTop ab. Zuerst Berechnung von areaOfTop, dann Berechnung von volume. Änderung von width oder depth ⇒ Neuberechnung areaOfTop und volume. 5. Dependency Graph und MEL [Computeranimation] – p.13/41 Knoten ohne compute-Funktion Nicht jeder Knoten muss compute-Funktion enthalten. Knoten halten dann nur Daten in Attributen Beispiel time Globaler Framezeitknoten Ein time-Knoten pro Graph outTime: time Graph erhält alle Zeitinformatio aus time-Knoten Hält aktuelle Frame in outTime Time Slider bewegen ⇒ outTime hält aktuellen Frame 5. Dependency Graph und MEL [Computeranimation] – p.14/41 Knotenverbindungen Knoten: Berechnet Output-Attribute mit Werten aus Input-Attribute Knotenverbindung Kante im DG Verbindet Output-Attribut eines Knotens M mit Input-Attribut eines Knotens N Regeln: ◮ Verbindung nur zwischen Attributen des gleiche Typs möglich ◮ Output-Attribut: Verbindung zu mehreren Input-Attributen ◮ Input-Attribut: Verbindung zu höchsten einem Output-Attribut 5. Dependency Graph und MEL [Computeranimation] – p.15/41 Knotenverbindungen Beispiel: Animation Sphäre entlang x-Achse time outTime: time animCurveTL transform input: time translate: double3 output: time translateX: double translateY: double translateZ: double ... andere Attribute 5. Dependency Graph und MEL [Computeranimation] – p.16/41 Datenfluss M N a : typ b : typ Knoten M, N mit Attributen M.a und N.b Keine Verbindung zwischen M.a und N.b ⇒ N.b speichert Wert in Knoten N . Verbindung M.a → N.b ⇒ Interner Wert von N.b wird ersetzt durch Wert von M.a Verbindung zwischen M.a und N.b trennen ⇒ N.b hält letzten aktuellen Wert von M.a. 5. Dependency Graph und MEL [Computeranimation] – p.17/41 Verbindungen Attribut mit mehreren Verbindungen Nicht erlaubte Verbindung node node a : float node node b : float a : float b : float c : float c : float node d : float 5. Dependency Graph und MEL [Computeranimation] – p.18/41 Grenzen des DG Knoten im DG: dependency nodes Komplexes Netzwerk von Verbindungen Problem: Übersichtlichkeit Darstellung von Hierarchien (z.B. Parenting) 5. Dependency Graph und MEL [Computeranimation] – p.19/41 DAG Knoten DAG: directed acyclic graph directed acyclic: Keine zyklischen Verbindungen graph: Keine Baumstruktur. Knoten kann mehrere Eltern haben Knoten im DAG: DAG-Knoten sind spezielle DG-Knoten visualisieren hierarchischen Strukturen (Eltern-Kind-Beziehung) Visualisierung von Knoten im Hypergraph entweder hierarchisch in DAG-Form, “Szene Hierarchy”, oder als Up- und downstream Verbindungen im DG 5. Dependency Graph und MEL [Computeranimation] – p.20/41 Beispiel Darstellung von DAG und DG-Knoten in einem Diagramm transform time animCurve transform shape Pfeile: Verbindung zwischen Attributen Linien: Hierarchische Eltern-Kind-Beziehung 5. Dependency Graph und MEL [Computeranimation] – p.21/41 Transform und Shape Nodes Prinzip: Erzeugung von 3D Objekten Resultat von zwei DAG Knoten Transform Node Bestimmt Position, Orientierung, ... von Objekt im Weltkoordinatensystem Bestandteile von Objekten sind im Objektkoordinatensystem gegeben Knoten transformiert Objekt- in Weltkoordinatensystem transform shape Shape Node Definiert Form eines Objekts Elemente des Objekts sind im Objektkoordinatensystem gegeben Kann ohne Transform Node nicht existieren 5. Dependency Graph und MEL [Computeranimation] – p.22/41 Parenting und Grouping Definition von Transformations-Hierarchien Parenting Knoten wird zum Kind-Knoten eines anderen Knotens Grouping Einfügen eines neuen Transform Nodes und einfügen von Knoten als Kind-Knoten torso head leftLeg rightLeg leftArm rightArm leftHand rightHand 5. Dependency Graph und MEL [Computeranimation] – p.23/41 DAG Pfad Position Objekts im Weltkoordinatensystem: bestimmt durch Transform Nodes bis zur Wurzel berechnet durch Multiplikation der Transformationsmatrizen Beispiel: Transformationsmatrix von leftHandshape torso Matrix * leftArm Matrix * leftHand Matrix DAG Pfad (DAG path) Spezielle Notation für Pfad von Wurzel bis Knoten Jeder Knotenname wird durch den Character | getrennt Beispiel: |torso|leftLeg|leftArm|leftArmShape Leerer Elternknoten vor torso: Globale Wurzel (root node) der Hierarchie ohne Transformation 5. Dependency Graph und MEL [Computeranimation] – p.24/41 Underworld Nodes Dreidimensionaler Raum Position von Objekten in kartesischen Koordinaten (x, y, z) gegeben Eindimensionaler Raum Beispiel: Kurven Eindimensionale Koordinate (u) Zweidimensionaler Raum Beispiel: NURBS-Oberflächen Zweidimensionale Koordinaten (u, v) Underworld node: Spezieller Transform Node Koordinaten im parametrisierten Raum ⇒ Welt- bzw. Objektkoordinaten 5. Dependency Graph und MEL [Computeranimation] – p.25/41 Beispiel Umschalten auf (u, v) Koordinaten NURBS-Oberfläche: Modify | Make Live Hypergraph ◮ Darstellen: Option − Display − U nderworld N odes ◮ Underworld-Verbindung: gestrichelte Linie DAG-Pfad ◮ Underworld-Verbindung: -> ◮ Beispiel: |nurbsPlane1|nurbsPlaneShape1->curve1|curveShape1 5. Dependency Graph und MEL [Computeranimation] – p.26/41 Instanzen Maya: Duplicate − Geometry T ype : Instance DAG-Knoten bestehend aus ◮ Transform Node ◮ Referenz auf Shape-Knoten: Geometrische Objekte, Kameras, Lichter, Instanzgruppen Zweck: Darstellung eines Objekts an mehreren Orten gleichzeitg Vorteile: ◮ Spart Speicherplatz, Rechenzeit ◮ Änderung Objekt wirkt sich auf alle Instanzen aus ◮ Wichtig um große Zahl gleicher Objekte zu erzeugen 5. Dependency Graph und MEL [Computeranimation] – p.27/41 Instanzen Darstellung im Hypergraph: ◮ Gestrichelte Linie Shape - Transform Node ◮ Deshalb: Hypergraph und nicht Hypertree Darstellung DAG-Pfad: ◮ Zwei (oder mehrere) Pfade zum Knoten ◮ |nurbsSphere1|nurbsSphereShape1 |nurbsSphere2|nurbsSphereShape2 5. Dependency Graph und MEL [Computeranimation] – p.28/41 Knoten bestimmen Syntax: ls [flags] [objectName [objectName...]] Rückgabewert: string[] Gibt Namen (optional Typ) von Objekten einer Szene zurück Filtern oder Vergleichen von Objekten bzgl Namen oder Typ Anwendung auf ◮ alle Objekte der Szene ◮ alle ausgewählten Objekte 5. Dependency Graph und MEL [Computeranimation] – p.29/41 Beispiel-Szene circle -n Kreis1; group; circle -n Kreis1; sphere -n Kugel1; group; instance; select -ado; // Gruppiere Kreis1 -> group1 // Gruppiere Kugel1 -> group2 // Instantiiere group2 -> group3 // Wähle alle DAG-Objekte aus 5. Dependency Graph und MEL [Computeranimation] – p.30/41 Knoten bestimmen Wildcards: * ls "Ka*"; -selection (-sl): Liste aller ausgewählten Objekte ls -sl; ls -sl "group1"; ls -sl "Ka*"; -long (-l): Voller DAG-Pfad für DAG-Knoten. Kürzester eindeutiger Pfad wird zurückgegeben ls -l "*Shape"; 5. Dependency Graph und MEL [Computeranimation] – p.31/41 Knoten bestimmen -showType (-st): Objektname und Typ zurückgeben ls -st; -type (-typ): Auflistung von Objekten mit speziellem Typ ls -type nurbsSphere; -dagObject (-dag): Auflistung von DAG-Objekten. Falls Name angegeben, werden alles DAG-Objekte unter dem Objekt zurück gegegeben speziellem Typ ls -dag group3; Beispiel: GetInstanceIndex.mel 5. Dependency Graph und MEL [Computeranimation] – p.32/41 Knoten auswählen Syntax: select [flags] [objectName ...] Rückgabewert: keiner Setzt ein oder mehrere Objekte auf Liste der ausgewählten (aktiven) Objekte -all (-all): Auswahl aller Knoten -clear (-cl): Auswahlliste löschen -add (-ad): Zur Auswahlliste hinzufügen select -add "Kugel1"; -deselect (-d): Aus Auswahlliste entfernen 5. Dependency Graph und MEL [Computeranimation] – p.33/41 Knoten erzeugen Meist: Erzeugung von Knoten mit MEL-Kommandos sphere, cone, torus, nurbsPlane, nurbsCube,.... Oft: ◮ -name (-n): Name des Knotens ◮ -constructionHistory ausschalten (-ch): Constructíon History an- oder sphere -ch on; //C.h. hinzufügen sphere -ch off; // C.h. nicht hinzufügen createNode nodeType [-shared] [-n nodeName] [-p dagParent] Erzeugt Knoten eines bestimmten Type unter einem Elternknoten 5. Dependency Graph und MEL [Computeranimation] – p.34/41 DAG-Hierarchien Syntax: listRelatives [flag] [object] Rückgabewert: string[] Listet Eltern- bzw. Kindknoten von DAG-Objekten auf -children (-c): Direkte Kinder des DAG-Knotens list relatives -c group3 -allDescendents (-ad): Gesamten Teilbaum unterhalb des Knotens -parent (-p): Direkte Eltern des DAG-Knotens -allParents (-ap): Alle Knoten aufwärts bis zur Wurzel listRelatives -ap Kugel1; 5. Dependency Graph und MEL [Computeranimation] – p.35/41 Knotenattribute Daten einer Szene sind in Knotenattributen gespeichert Knotenverbindungen bestimmen Datenfluss Kommandos: getAttr Rückgabe des Werts eines DG-Knotenattributs setAttr Setzt Wert eines DG-Knotenattributs 5. Dependency Graph und MEL [Computeranimation] – p.36/41 Knotenattribute ausgeben Syntax: getAttr [flags] [-time] object.attribut Rückgabetyp: Abhängig vom Typ des Attributs Gibt den Wert eines Knotenattributs zurück. -time (-t) Wert des Attributs zu bestimmten Zeitpunkt -type (-typ) Typ des Attributs Beispiel: $radius = ‘getAttr makeNurbSphere1.radius‘; print("\nRadius: " + $radius); float $s[] = ‘getAttr Kugel1.scale‘; print("\nKugel1.scale: \n"); print($s); getAttr -type Kugel1.scale; //Typ des Attributs 5. Dependency Graph und MEL [Computeranimation] – p.37/41 Knotenattribute setzen Syntax: setAttr [flags] object.attribut [values] Rückgabewert: Keiner Setzt den Wert eines Knotenattributs Komplexe Attributtypen müssen in einzeln Komponenten zerlegt angefügt werden. Beispiel: setAttr makeNurbSphere1.radius 2.5; $radius = ‘getAttr makeNurbSphere1.radius‘; print("\nRadius: " + $radius); vector $sc = << 1.5, 2.3, 1.4 >>; // setAttr Kugel1.scale $sc geht nicht! // Statt dessen setAttr Kugel1.scale ($sc.x) ($sc.y) ($sc.z); 5. Dependency Graph und MEL [Computeranimation] – p.38/41 Koordinatensysteme in Maya Hierarchie von Transformationen gegeben durch transform nodes trafoA trafoB Shape node: Erzeugt Geometrie trafoC Transform node: Affine Transformation shape Transformation eines Punkt p des shape node in Weltkoordinaten: p′ = trafoA · trafoB · trafC · p 5. Dependency Graph und MEL [Computeranimation] – p.39/41 Koordinatensysteme in Maya Transformation spaces Object Space ◮ Koordinatensystem des Objekts ◮ Punkte die im Shape Node erzeugt werden sind in Object Space-Koordinaten p(obj) . ◮ Koordinatenurspung: Im Allg. Zentrum der Bounding Box des Objekts ◮ Pivot point im Ursprung des Koordinatensystems 5. Dependency Graph und MEL [Computeranimation] – p.40/41 Koordinatensysteme in Maya Local / Parent Space ◮ Koordinatensystem des Elternknotens ◮ Objekt-zu-Elterntransformation: objektname.parentMatrix ◮ Im Beispiel: p(loc) = trafoC · p(obj) ◮ Eltern-zu-Objekttransformation: objektname.parentInverseMatrix World Space ◮ Koordinatensystem der gesamten Szene ◮ Ursprung im Zentrum der Szene ◮ Objekt-zu-Welttransformation: objektname.worldMartix ◮ Im Beispiel: p(world) = trafoA · trafoB · trafoC · p(obj) ◮ Welt-zu-Objekttransformaiton: objektname.worldInverseMatrix Beispiel: SpaceToSpace.mel 5. Dependency Graph und MEL [Computeranimation] – p.41/41 Knotenverbindungen Verbindungen zwischen Knotenattributen bestimmten Gesamtszene Kommandos: listConnection Verbindungen eines Objekts ausgeben connectionInfo Test ob Attribut in Verbindung mit anderem Attribut steht isConnected Test ob Attribute zweier DG-Knoten miteinander verbunden sind 5. Dependency Graph und MEL [Computeranimation] – p.42/41 Knotenverbindungen ausgeben Syntax: listConnection [flags] [Object[.attribute]] Rückgabewert: string[] Liste der Verbindungen Gibt Liste aller Attribute/Objekte eines spezifizierten Types zurück, die mit gegebenem Objekt verbunden sind Falls keine Objekte spezifiert: Verbindungen der ausgewählten Knoten -source (-s) {on, off} Attribute auf “Source”-Seite des Objekts (eingehende Verbindung) -destination (-d) {on, off} Attribute auf “Destination”-Seite des Objekts (ausgehende Verbindung) -plugs (-p) {on, off} Gibt Attributnamen (plugs) aus, nicht nur Objektnamen 5. Dependency Graph und MEL [Computeranimation] – p.43/41 Verbindungstest 1 Syntax: connectionInfo [flags] plugName Rückgabewert: boolean, string, string[] Test ob Attribute Source oder Destination für eine Verbindung sind Falls keine Objekte spezifiert: Verbindungen der ausgewählten Knoten -isSource (-is) True gdw. plugName Quelle einer Verbindung -isDestination (-id) True gdw. plugName Ziel einer Verbindung -destinationFromSource (-dfs) Falls plugName Source ist, Rückgabe der Desinations -sourceFromDestination (-sfd) Falls plugName Destination ist, Rückgabe der Source 5. Dependency Graph und MEL [Computeranimation] – p.44/41 Verbindungstest 2 Syntax: isConnected sourcePlug destinationPlug Rückgabewert: boolean Test ob zwei Attribute miteinander verbunden sind true gdw. zwei Attribute miteinander verunden Beispiel: VerbindungsInfos.mel 5. Dependency Graph und MEL [Computeranimation] – p.45/41 Utility Knoten Bisher: Einfache Verbindung von Attributen A.x = B.y Jetzt: Attributwerte werden durch Funktion verändert: A.x = f (B.y) mit einer Funktion f . In Maya: Vordefinierte Funktionen mit Hilfe von Utility Nodes DG-Knoten Haben ein oder mehrere Input- und Outputattribute Berechnen Outputwerte mit Hilfe einfacher Operationen 5. Dependency Graph und MEL [Computeranimation] – p.46/41 Utility Knoten Vorteil: Schnellere Auswertung als Expressions Übersichtlich Nachteil: Nicht alle Berechnungen lassen sich mit Utility Nodes realisieren Verbindungen von und zu Utility Nodes müssen “von Hand” erstellt werden 5. Dependency Graph und MEL [Computeranimation] – p.47/41 Erzeugung von Utility-Knoten GUI: Erzeugen: Hypershade/Create Verbinden mit Connection Editor MEL: Erzeugen: createNode utilitynodename; Attribute des Utility-Nodes mit Attributen der Objekte verbinden Evtl. Utility Node mit setAttr konfigurieren Beispiel: Utility1.mel 5. Dependency Graph und MEL [Computeranimation] – p.48/41 Beispiel für Utility-Knoten In Maya-Hilfe unter Node and Attribute Reference zu finden Beispiele plusMinusAverage Summe, Durchschnitt oder Differenz einer Menge von Input-Attributen multiplyDivide Multiplikation oder Division von ein bis drei float-Werten vectorProduct Skalarprodukt, Kreuzprodukt, Vektor mal Matrix, Punkt mal Matrix condition Vergleich zweier Input-Knoten und Ausgabe eines Wertes setRange Abbildung eines Intervalls auf ein anderes 5. Dependency Graph und MEL [Computeranimation] – p.49/41