Procedurele modellering met MEL Script in Maya - dag 1

Deze tutorial introduceert de opwindende mogelijkheden voor modellering met Maya's MEL-scriptingtaal. In dit eerste deel zullen we de basisprincipes van MEL-opdrachten leren en twee procedurele modelscripts maken die nuttig kunnen zijn in uw eigen workflows.

Kijk onder de motorkap

De Maya Embedded Language (of MEL) is de opdrachtstructuur die Maya gebruikt om zowat alles te maken wat je op het scherm ziet. Telkens wanneer u een object maakt of een hoekpunt verplaatst, wordt een MEL-opdracht aangeroepen om die actie te laten plaatsvinden. Zelfs alle vensters, schappen, tabbladen, menu's en editors worden gegenereerd en georganiseerd met behulp van MEL-scripts. Als je wilde, kon je de Maya-interface volledig opnieuw bouwen met niets anders dan MEL, waardoor de scriptingtaal een ongelooflijk krachtig hulpmiddel was om als artiest onder je riem te hebben. Als u scripting kunt gebruiken om de meest tijdrovende delen van uw werk te automatiseren, dan kunt u zoveel meer tijd besteden aan het maken van uw werk.

De beste plaats om te leren over specifieke MEL-opdrachten is in het gedeelte Technische documentatie van de Maya Documenten en de beste manier om bekend te raken met de concepten achter MEL is door ze in actie te zien. Laten we ingaan op het systeem en aan de slag gaan met ons eerste script.


Script One

Het eerste script maakt een vierkante buis met de vlakke zijden uitgelijnd op de X- en de Z-assen. We zullen het maken van het script doornemen en een plankknop maken om het te openen.


Stap 1

Schrijf je pseudo-code op.

Pseudo-code is een duidelijk Engelse vorm van een script, waarbij elke belangrijke stap wordt vermeld. Wanneer u begint te werken aan complexe scripts, wordt het erg belangrijk om uw scripts te schetsen voordat u ooit begint. Voor ons kan de pseudo-code er als volgt uitzien:

 Maak een vierzijdige veelhoekige pijp Draai 45 graden in Y Ga naar het grondvlak zitten Verplaats het draaipunt naar de oorsprong Freeze-transformaties

Stap 2

Open de scripteditor door op de knop rechtsonder in het hoofdvenster van Maya te klikken.

In de scripteditor zijn er twee hoofdpanelen, het statuspaneel hierboven en het MEL / Python-venster hieronder. Zorg ervoor dat het MEL-tabblad is geselecteerd.


Stap 3

Teken een "pijp" -primitief in de Maya-scène.

In het statusvenster van het scripteditorvenster zou u iets dergelijks moeten zien als:

 polyPipe -ch on-o on -r 2.958298 -h 2.434319 -t 0.9; // Resultaat: pPipe1 polyPipe1 //

Stap 4

Kopieer en plak de polyPipe-opdracht vanuit de statusregel in de Scripteditor.

U zou een exact duplicaat van de eerste polyPipe moeten krijgen, deze keer precies op de oorsprong.


Stap 5: De code doorbreken

De polyPipe-opdracht die u zojuist hebt gebruikt, is een van de duizenden MEL-opdrachten die voor u beschikbaar zijn. Hun structuur (wat programmeurs syntax noemen) is vrijwel hetzelfde voor elke opdracht:

 melCommand -vlag waarde -vlag2 waarde targetObject;

Het eerste deel is het commando zelf, en de vlaggen (aangegeven met het streepje) definiëren bepaalde attributen van het commando. Opdrachten die objecten manipuleren die al bestaan, vereisen vaak een doelwit, dat de opdracht vertelt welk object moet worden gewijzigd. Voor elke opdracht is ook een puntkomma vereist, die het einde van de opdracht markeert.

In het voorbeeld van polyPipe definiëren de drie onderstaande vlaggen de straal, hoogte en dikte van de gemaakte pijp.

 -r 3.162278 -h 3.514619 -t 0.8

We zullen later in de tutorial in detail andere vlaggen bespreken, wanneer we het script samenvoegen.

De procedurele modelleringsworkflow in MEL is in essentie slechts een slimme combinatie van opdrachten die geometrie maken of manipuleren in Maya.


Stap 6

Verwijder de originele pipe en selecteer degene die u zojuist hebt gemaakt met behulp van de MEL-opdracht.


Stap 7

Stel het aantal asonderverdelingen in op vier en kies enkele "mooie" gehele getallen voor de hoogte, radius en diepte. We zullen deze later wijzigen en ze zullen het voorbeeld eenvoudiger maken.

Deze instellingen kunnen worden aangepast met de polyPipe-opdracht op het moment dat het object met vlaggen wordt gemaakt, dus maak je geen zorgen over wat de scripteditor je geeft.


Stap 8

Draai het object op de Y-as 45 graden

Als u het object met de hand roteert, zou het resultaat in de scripteditor er ongeveer zo uit moeten zien:

 roteren -r -os 0 -45 0;

Als u het object roteert door de rotatiewaarde in te typen, wordt het resultaat:

 setAttr "pPipe3.rotateY" 45;

Voor nu gebruiken we de rotatie-opdracht in ons script. In latere tutorials zullen we setAttr gebruiken om met specifieke objectattributen te werken.


Stap 9

Verplaats de pijp zodat deze op het roostervlak zit

Als u het object met de hand verplaatst, moet de code in de scripteditor zijn:

 verplaats -r 0 1 0;

Als u het object verplaatst door de y-waarde in te typen:

 setAttr "pPipe3.translateY" 1;

Nogmaals, we zullen het commando move gebruiken in plaats van setAttr.


Stap 10

Druk op "invoegen" en verplaats het draaipunt van de pijp naar de oorsprong.

Hiermee kunt u de pijp eenvoudig van een grondvlak schalen. Dit is de code die ik krijg in de scripteditor:

 verplaats 0 0 0 pPipe3.scalePivot pPipe3.rotatePivot;

Merk op dat de code hier twee doelen heeft: polyPipe3.rotatePivot en polyPipe3.scalePivot. Dit betekent dat de code alleen kan worden gebruikt als het object in kwestie polyPipe3 wordt genoemd. In latere zelfstudies behandelen we dit probleem door variabelen te gebruiken, maar voor nu werken we er omheen door een ander commando te gebruiken dat hetzelfde doet:

 xform -a -rotatePivot 0 0 0 -scalePivot 0 0 0;

Stap 11

Bevries de transformaties van het object door naar het wijzigingsmenu te gaan en Vastzettransformaties te kiezen.

De code in de scripteditor:

 makeIdentity -apply true -t 1 -r 1 -s 1 -n 0;

makeIdentity is een manier om de transformaties te bevriezen, maar het is geen heel intuïtief benoemde opdracht. Maya heeft nogal wat ingebouwde scripts die bepaalde processen automatiseren, inclusief invriestransformaties.


Stap 12: Laten we dat nog eens proberen ...

Ga in de scripteditor naar Geschiedenis en schakel Echo All Commands in. Dit dwingt de scripteditor tot "echo" of geeft alle opdrachten weer die maya uitvoert, zelfs als de gebruiker deze niet actief heeft ingeschakeld.


Stap 13

Bevries de transformaties opnieuw en bekijk de uitvoer van de scripteditor. Je ziet de volgende code:

 FreezeTransformations; makeIdentity -apply true -t 1 -r 1 -s 1 -n 0;

FreezeTransformations is een maya-helper-script, een "runtime-commando" dat makeIdentity aanroept. In tegenstelling tot reguliere Maya-commando's beginnen runtime-commando's meestal met hoofdletters. Wees voorzichtig met het gebruik van deze scriptopdrachten in je code, omdat ze mogelijk niet op dezelfde manier worden ondersteund door alle installaties van Maya. Voor FreezeTransformations is het nadeel dat de opdracht de waarden neemt die zijn ingesteld in het dialoogvenster Freeze Transform Options, dat anders kan worden ingesteld afhankelijk van de laatste keer dat u het hebt gebruikt. Ik verander zelden de instellingen van de standaard, dus ik ben comfortabel met het gebruik van FreezeTransformations en andere hulpscripts. Dit is een persoonlijke voorkeur, maar ik ben van mening dat het gemak van het gebruik van runtime-opdrachten groter is dan het risico dat een script kan verbreken. Het is echter belangrijk om te begrijpen dat runtime-opdrachten in complexe scripts problemen kunnen veroorzaken en het gebruik van scripts die op maya-dialoogvensters zijn gebaseerd, is een slechte gewoonte als u van plan bent het script aan iemand anders te geven. Dat gezegd hebbende, het gebruik van Echo All Commands is een goede manier om de achtergrondscripts en opdrachten te vinden die niet in de technische documentatie staan.


Stap 14: Alles samenvoegen

Tot nu toe hebben we vijf opdrachten doorgenomen die kunnen worden samengevoegd om ons object te maken. Laten we die opdrachten in lijn brengen met onze pseudo-code, en een kijkje nemen naar de specifieke vlaggen van elke persoon. Elke vlag heeft twee "modi", een lange naam en een verkorte vorm. Meestal heeft de steno slechts één of twee letters. Persoonlijk geef ik er de voorkeur aan de stenografie te gebruiken waar mogelijk, maar het gebruik van de volledige naam kan nuttig zijn voor beginners en maakt je code leesbaarder voor niet-scripters. Laten we de commando's afbreken:

 // Maak vierzijdige polygoonpijp (een double-forward schuine streep geeft een opmerking in de code aan, die wordt genegeerd door MEL) polyPipe -r 3 -h 4 -t 1 -sa 4;

Relevante vlaggen:

  • -radius (-r) bepaalt de straal van de buis
  • -hoogte (-h) definieert de y-hoogte
  • -dikte (-t) definieert de dikte van de polyPipe, gemeten vanaf de buitenrand van de straal naar binnen
  • -onderverdelingenAxis (-sa) definieert hoeveel zijden de polyPipe heeft
 // Roteer 45 graden in Y rotate -r -y 45;

Relevante vlaggen:

  • -relative (-r) roteert het object ten opzichte van zijn huidige positie
  • -rotateY (-y) zet de rotatie op de y-as
 // Verplaats om op het grondvlak te gaan bewegen -r 0 1 0;

Relevante vlaggen:

  • -relative (-r) verplaatst het object ten opzichte van de huidige positie

De opdracht move gebruikt hier een iets andere syntaxis van de rotatieopdracht. 0 1 0 is een afkorting voor vertalen 0 in x, vertaal 1 in y en vertaal 0 in z. MEL is een zeer flexibele taal en heeft vaak meer dan één manier om precies hetzelfde te doen. In dit geval hadden we ook kunnen doen:

 // Verplaats om op het grondvlak te gaan zitten verplaats -r -y 1;

De keuze is aan u, en een groot deel van het scripten is het ontwikkelen van uw eigen voorkeuren en stijlen.

 // Verplaats draaipunt naar oorsprong xform -ws -rp 0 0 0 -sp 0 0 0;

Relevante vlaggen:

  • -worldSpace (-ws) verplaatsen naar een absolute positie in de wereldruimte
  • -rotationPivots (-rp) verplaatsen de draaipunten in de x-, y- en z-richting
  • -scalePivots (-sp) verplaatsen de schaalverdraaiingen in de x-, y- en z-richtingen

xform heeft een enorm aantal vlaggen en kan voor een groot aantal functies worden gebruikt. We zullen deze zeker weer terugzien in toekomstige tutorials.
// bevries de transformaties van het object
FreezeTransformations;


Stap 15

Zet alle opdrachten in de scripteditor. Dit is wat je zou moeten hebben:


Stap 16

Markeer de code in de scripteditor en sleep met de middelste muis het script naar de plank 'polygonen'. Hiermee wordt een aangepast schappictogram gemaakt met uw script eraan gekoppeld. Elke keer dat u op die knop klikt, wordt het script uitgevoerd.


Stap 17

Als u een aangepast label aan de schapknop wilt toevoegen, opent u de schap-editor door op de naar beneden wijzende pijl helemaal links van het venster te klikken en vast te houden. Zoek in de Shelf-editor uw nieuw gemaakte knop en voeg een label- en pictogramnaam toe. De naam van het pictogram moet meestal minder dan vijf tekens bevatten. Gefeliciteerd! U hebt nu uw eerste door MEL aangedreven modelleringsscript voltooid.


Script 2

Nu we de touwen hebben geleerd, schieten we door een nog meer vergelijkbaar voorbeeld. Hier zullen we toepassen wat we al hebben geleerd en een eenvoudig "afgerond kubusmodel" maken.


Stap 1

Schrijf je pseudo-code op.

 Een polygoonkubus maken Verplaats om op het grondvlak te gaan Verplaats draaipunt naar oorsprong Freeze-transformaties selecteer alle randen van de schuine kanten van het object met drie divisies

Stap 2

Maak de opdracht Veelhoekkubus

 // maak een cube-polyCube -w 4 -h 4 -d 4 -sx 1 -sy 1 -sz 1;

Relevante vlaggen:

  • -breedte (-w)
  • -hoogte (-w)
  • -diepte (-w)
  • -onderverdelingenX (-sx)
  • -onderverdeling Y (-sy)
  • -subdivisionsZ (-sz)

Stap 3

Creër de "verplaats naar grondvlak", "beweeg draaipunten" en "bevries transformaties" commando's, net als het vorige script.

 // verplaats de verplaatsing van de kubus -r 0 2 0; // Verplaats draaipunt naar oorsprong xform -ws -rp 0 0 0 -sp 0 0 0; // freezeTransformations bevriezen;

Stap 4

Gebruik een commando om alle randen van de kubus te selecteren. Er zijn een aantal manieren om dit te doen. Omdat het object al is geselecteerd wanneer MEL het genereert, gebruik ik graag een van Maya's helper-scripts om dit te doen.

 // selecteer randen ConvertSelectionToEdges;

Stap 5

Gebruik een afvlakopdracht om nieuwe randen in uw kubus te maken.

 // afschuining polyBevel -oaf 1 -o .2 -sg 3 -fn 1 -mv 1 -sa 180;

Relevante vlaggen:

  • -offsetAsFraction (-oaf) wanneer true, de schuine waarde wordt bepaald door een fractie van de lengte van aangrenzende randen.
  • -offset (-o) bepaalt de mate van afschuining die moet worden toegevoegd
  • -segmenten (-sg) het aantal randen dat aan de afgeschuinde randen moet worden toegevoegd
  • -fillNgon (-fn) wanneer true, onderverdeelt de hoeken waar de schuine kant n-zijdig gezichten maakt
  • -mergeVertices (-mv) wanneer true, voegt de gemaakte hoekpunten van de gevulde n-zijdige vlakken samen
  • -smoothingAngle (-sa) Bepaalt in welke hoek de schuine rand normaal moet worden

Stap 6

Voeg alles samen:

 polyCube -w 4 -h 4 -d 4 -sx 1 -sy 1 -sz 1; verplaats -r 0 2 0; xform -ws -rp 0 0 0 -sp 0 0 0; FreezeTransformations; ConvertSelectionToEdges; polyBevel -oaf 1 -o .2 -sg 3 -fn 1 -mv 1 -sa 180;

Stap 7

Maak je plankpictogram, hernoem het en we zijn klaar!