Animatie 4 Meer connecties

1. Constraining

We zijn  al eerder de Normal Constrain tegen gekomen in les 2. Constraining is een snelle manier om bepaalde connecties te maken. Zo werd in dat voorbeeld de normaal van een surface verbonden met de rotaties van een object. In de Channelbox kleurden deze connecties lichtblauw. Zodra we dat zien, weten we dat we met een constrain van doen hebben.

Bij Constrains is er altijd sprake van een Master-Slave relatie of in Maya terminologie ‘Target’ en ‘Object To Constrain’. Het betekent niet meer dan dat het ene object bepaalt wat het andere doet, op een bepaald gebied.

De meest algemene constraints zijn de Orient Constrain, de Point Constrain en de Aim Constrain.

Orient


  • Create->Polygon Primitives->Cylinder->Option Box. Kies Axis X.
  • Maak een kopie (CTRL+d).
  • Selecteer eerst het origineel (Target) en dan met Shift het kopie (Object to Constrain).
  • Constrain->Orient.
  • Test de constrain door het origineel te roteren, het kopie volgt.

Je zou zeggen: hier gebeurt precies hetzelfde wanneer de rotaties verbonden zouden zijn via de Connection Editor. Dit is ten dele waar, de rotaties worden in beide gevallen doorgegeven. Maar wat een directe connectie niet heeft, is de orientConstrain node die aangemaakt wordt. Deze bevat offset-waarden en een switch. De switch heeft de naam van het target, gevolgd door W0. Je vind de switch in de Channelbox, wanneer je klikt op pCylinder2_orientConstrain. Je kunt de constrain dus aan en uit zetten, door W0 op 1 of 0 te zetten.

Aim

  • Maak er een Pyramide bij: Create->Polygon Primitives->Pyramid.
  • Selecteer pCylinder1 en daarna met shift pPyramid1.
  • Constrain->Aim->Option Box.
  • Zet de Aim Vector op 0 1 0 (Y is nu de aim richting)
  • Test de constrain door beide objecten te bewegen. De pyramide blijft wijzen naar de cylinder.

De Aim Constrain is uiterst nuttig bij het animeren van de kijkrichting van een karakter. Je kunt ook een lamp of een camera richten op een bepaald punt.

Tip:

Als je korte info wilt over een functie, over wat je moet selecteren of de volgorde van selectie, ga dan naar het menu item en highlight het door je mousepointer erboven te houden, zonder er op te klikken. In de helpline, de alleronderste rand van de interface, verschijnt een tekst die je verder helpt.

Point

Bij elke constrain geldt dat je eerst het Target (Master) selecteert en dan The Object To Constrain (Slave) erbij selecteert. In deze volgorde. De helpline zegt: “Select one or more targets followed by the object to constrain”.

De volgorde van selecteren is nu duidelijk, maar ook dat je blijkbaar meerdere targets mag hebben. Dat gaan we proberen.

  • Maak nog een kopie van de 1e Cylinder.
  • Verplaats deze zodat alle 3 cylinders op een rij staan.
  • Selecteer de 2 buitenste cylinders ( de targets).
  • Selecteer als laatste erbij de middelste cylinder.
  • Constrain->Point->Option Box.
  • Wees er zeker van dat Maintain offset uit staat.
  • Druk op Add.

Het resultaat is dat de middelste cylinder precies in het midden gaat staan. Wanneer je een van de anderen verplaatst zal deze het midden tussen beide targets blijven opzoeken. Maar dat kan ook anders, wanneer we kijken naar de pointConstrain Node: Selecteer de middelste Cylinder en klik op pCylinder2_pointConstrain. We zien behalve het W0 attribute nu ook een W1 attribute.

Met één W attribute heb je een switch, nu heb je behalve een switch, ook iets dat het gewicht geeft van de targets. Probeer het volgende:

  • Geef P Cylinder1 W0 de waarde 0.5.
  • Nu trekt pCylinder3 twee keer zo hard als pCylinder1.

Vaak wordt een crossfade van W0 en W1, geanimeerd met keyframes, gebruikt om iets door te geven. Bijvoorbeeld een geanimeerd karakter pakt een appel van een tafel.

2. Expressions

We gaan even een paar stappen terug, delete alles behalve de eerste cylinder. Check de Channelbox of er nog connecties zijn en verbreek deze zonodig.

  • Maak een verse kopie van de cylinder. We hebben nu 2 objecten: pCylinder1 en pCylinder2.
  • Highlight pCylinder2 RotateX in de Channelbox. Het woord, niet de waarde.
  • Pointer over de Channelbox: RMB->Expressions… De Expression Editor opent.

In de bovenste velden zijn highlighted : links bij Objects pCylinder2 en rechts bij Attributes rotateX. Daaronder staat bij Selected Object and attribute pCylinder2.rotateX.

  • Highlight pCylinder2.rotateX en MMB drag dit woord naar het Expression veld.
  • Typ er een = teken achter en MMB drag wat links van de = staat naar rechts van dat teken.
  • Verander de laatste pCylinder2.rotateX in pCylinder1.rotateX
  • Zet er nog een ; achter en druk op Create.

Wanneer je typfouten hebt gemaakt krijg je een foutmelding in de commandline rechtsonder in de interface. Is het goed gegaan dan krijg je

// Result: expression1 te zien.

  • Roteer pCylinder1 over X. Als het goed is volgt pCylinder2.

We hebben precies hetzelfde resultaat als bij de Connection Editor en de Orient Constrain. Alleen kunnen we nu rekenkundige zaken toevoegen zoals een vermenigvuldiging.

Om te laten zien dat een Channel bezet is door een expression, is deze paars in de Channelbox.

  • Om de expression te bewerken keren we terug naar de Expression Editor door het juiste object te selecteren
  • En door  RMB op de Channel (de paarse)  verschijnt het popupmenu. Kies Expressions…
  • Verander de regel in pCylinder2.rotateX = pCylinder1.rotateX*2;
  • Test de RotateX van pCylinder1.

Expressions geven meer vrijhijd dan de andere methoden om connecties te customizen.

Een klassiek voorbeeld zijn tandwielen:

Wanneer we nu de expression zouden veranderen in pCylinder2.rotateX = pCylinder1.rotateX*-1;, dan zouden de 2 evengrote cylinders zich gedragen als tandwielen. Maar wat als de een kleiner is als de ander?

Dat valt uitstekend te berekenen: wanneer tandwiel A een stuk aflegt is dat een gedeelte van zijn omtrek. Diezelfde afstand wordt afgelegd op de omtrek van tandwiel B in tegenovergestelde richting.

  • We zoeken echter geen afstanden maar een rotatiewaarde.
  • We kennen de rotatie van A en we willen de rotatie van B weten.
  • We weten eveneens: afstand A = afstand B.

Het is in ons geval een uitgangspunt dat we weten hoeveel graden A nodig heeft om een voor ons onbekende afstand af te leggen.

  • Wanneer ze evengroot zijn heeft B hetzelfde aantal graden nodig om dezelfde afstand als A af te leggen.
  • Wanneer B groter is heeft B minder graden nodig om dezelfde afstand als A af te leggen
  • Wanneer B kleiner is, heeft B meer graden nodig om dezelfde afstand als A af te leggen.

Neem het laatste geval B < A :

Hoeveel meer graden B nodig heeft, hangt er vanaf hoeveel kleiner B is dan A. Dus we moeten de verhouding tussen A en B weten, om uit te kunnen rekenen hoeveel graden B meer nodig heeft om dezelfde afstand af te leggen als A.

We zoeken een factor die de verhouding weergeeft tussen beide cirkels. Die factor zou de verhouding aan moeten geven van de hoeveelheid rotatie die overgebracht wordt. We zouden voor die verhouding de omtrek kunnen nemen van beide cirkels.:

Dan krijgen we: omtrek A /omtrek B

  • Heeft A een omtrek van 1 en B een omtrek van 4, dan is de factor 1 / 4 = 0.25
  • Stel dat A 10 graden roteert, dan wordt 0.25 * 10 = 2.5 graden overgebracht.

Probleem is dat we de omtrek niet weten, die zouden we wel kunnen berekenen. De formule voor de omtrek van cirkel is: 2* pi * r

  • Dus de rotatie van tandwiel B is (2*pi*straal A / 2*pi*straal B) * rotatie van tandwiel A * -1
  • Dat kan vereenvoudigd worden doordat 2*pi zowel boven als onder in de deling staat: rotateB = (rA/rB)*- rotateA.
  • Dus we hebben alleen de straal van A en B nodig. Dat komt goed uit, want die is bekend.

We vinden een radius terug bij pCylinder1 inde INPUTS onder polyCylinder1. Bij polyCylinder2 is echter geen radius te bekennen. Dat zit ‘m in het feit dat PolyCylinder1 een zogenaamde ‘creation node’ is. Deze wordt aangemaakt wanneer je een nieuw standaard object maakt. Wanneer je Delete History doet verdwijnt de creation node. De creation node kan gezien worden als Construction History.

Met kopiëren gaan input nodes (wat de creation node hier is) niet automatisch mee.

Tip:

Om erachter te komen of iets tot de input of de output behoort, kun je het bekijken in de Hypergraph. De pijlen verschaffen duidelijkheid.

Om de input nodes mee te nemen:

  • Delete pCylinder2
  • Selecteer pCylinder1
  • Edit->Duplicate Special->Option Box
  • Check Duplicate Input graph
  • Druk Duplicate Special of Apply
  • Verplaats de nieuwe pCylinder2
  • Check of deze de inputnode polyCylinder2 met Radius wel heeft

Nu kunnen we de expression schrijven op de pCylinder2.rotateX:

pCylinder2.rotateX = -pCylinder1.rotateX*(polyCylinder1.radius/polyCylinder2.radius);

Tip:

Wanneer de creation node verdwenen is, kan ook de ScaleY of de ScaleZ gebruikt worden. Kies bijvoorbeeld Y en maak de connectie scaleZ = scaleY met de Connection Editor. Gebruik scaleY verder als straal.

Tip:

Gebruik geen Interactive Creation wanneer je met verhoudingen werkt, je weet dan met geen mogelijkheid hoe groot je object is. Geen Interactive Creation geeft altijd objecten met de grootte van 1, of een radius van 1.

Keuzes maken

Interessanter wordt het wanneer je onder bepaalde voorwaarden een keuze kan maken. Het volgende voorbeeld laat dat zien.

  • Maak een polygons Cone en een Cube
  • Scale de cube 0.5 0.5 0.5 en verplaats de cube langs de x-as
  • Selecteer pCone1 en highlight in de channelbox rotateX
  • Vanuit het menu van de channelbox Edit->Expression Editor
  • Typ de volgende expressie, let op hoofdletters en een afsluitende puntkomma per regel


Druk op Create en test de expressie door het blokje in Z-richting heen en weer te bewegen.

Toeval implementeren

Geef je expression een random element door gebruik te maken van de functie rand( ). Je kunt bijvoorbeeld rand(90) schrijven. De computer geeft dan een random getal tussen 0 en 90. Wat ook kan is een range opgeven:  rand(70,110). De computer geeft nu een getal terug tussen 70 en 110. We passen de expression als volgt aan:

Als we het blokje nu heen en weer bewegen zien we dat we een automatische trilfunctie hebben gemaakt.

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s