Procedural Modellering med Mel Scripts i Maya - Dag 2
Denne opplæringen er en innføring i bruk av eksterne MEL filer og prosedyrer, funksjoner, løkker, og regisserte samhandling innenfor Maya arbeidsområdet. Vi kommer til å gå over grunnleggende koding praksis, og å sette sammen en kjekk liten geometrisk objekt som ville være svært vanskelig å lage uten scripting
Tilleggsfiler /Plugins.
Opprette prosedyrer
i denne opplæringen, vi skal skape en ekstern script fil med fire "prosedyrer" - selvstendige skript som er ment å oppnå konkrete mål. Den første prosedyren vil ta en rekke objekter som er valgt i Maya view og skape en kjedet hierarkiet for dobbel-transformasjoner. Den andre skriptet vil un-foreldre valgte objekter, og den tredje vil flytte dreiepunktene av utvalgte objekter i verdensrommet opprinnelse. Disse tre skript lar deg enkelt lage noen interessante effekter med flere objekter. Den fjerde prosedyren vil kombinere alle de tre første til å opprette en "Fermats Spiral", lik den komplekse hjulet funnet på solsikke hodet.
Trinn 1
Åpne Maya. For i løpet av denne opplæringen, vil jeg være å bruke Maya 2010, men de samme kommandoene skal fungere for de fleste versjoner av Maya. Start med å lage en kube i midten av synsfeltet.
Trinn 2
Gå til "Rediger > Duplicate Spesial "og klikk på alternativet boksen for å få opp denne dialogboksen. Lag ni eksemplarer
Trinn 3
Gå til "Vindu >.; Hypergraph Hierarki '. Vi trenger nå å forelder kuber sammen for å lage en "kjede". For å gjøre dette, klikker du første 'pCube2 "og deretter skifte klikk pCube1", og trykk "p" på tastaturet. Dette foreldre den første valgte objektet (pCube2) til den andre valgte (pCube1).
Fortsett denne prosessen (velge barnet, så forelderen og deretter trykke "P" for å kjede dem sammen,) for hver av våre terninger. Når du er ferdig, bør hvert objekt i midten av hierarkiet har en forelder og ett barn kube, og den generelle hierarkiet skal se slik ut:
Trinn 4
Lukk 'Hypergraph hierarki vinduet. Velg alle objekter ved marquee-dra over kuber i midten av synsfeltet. Deretter holder alle de valgte kuber, prøve å flytte og rotere dem.
Fordi hver kuben transformasjoner er nå i forhold til kuben ett skritt over i kjeden, gjør den resulterende dobbelt transformasjon deg å flytte kuber i en veldig unik måte -. små oversettelser raskt bli store endringer
Trinn 5
med alle kuber fortsatt valgt, trykk Shift-P 'på tastaturet for å un-foreldre kuber. Vi har nå gått gjennom alle de store skritt som vi ønsker å automatisere med vår script. Så starter en ny Maya-fil, og åpne opp en tekst editor. Min personlige favoritt er Notepad ++, som selv har en MEL språk plugin tilgjengelig. Føl deg fri til å bruke hvilken som helst tekst editor du foretrekker, men for nå vil jeg bruke gode gamle Microsoft Notepad. Notisblokk er enkelt, men det får jobben gjort.
Trinn 6
Gå videre og lagre filen. Når du lagrer en MEL dokument, sørg for å velge "Alle filer" under "lagre som type". Lagre dokumentet som en .mel fil i Maya scripts katalogen. Jeg skal bruke EdW_DoubleTransform.mel som min filnavn.
Trinn 7
For å lage en prosedyre, må du vite et par ting på forhånd. Først må du definere en "scope" for prosedyren. Scope etablerer hvor en prosedyre kan nås fra. En "lokal" scope betyr at koden er bare tilgjengelig for andre prosedyrer innenfor samme .mel fil. "Global" betyr at prosedyren er tilgjengelig for andre skriptfiler og brukeren, og er også lastet inn i minnet. Vanligvis bruker jeg mye av globale prosedyrer. Dette er ikke den absolutt beste koding praksis, men jeg liker å ha mine prosedyrer tilgjengelig på tvers av flere skript. For det andre må du velge et navn på prosedyren. Generelt, prøv å velge noe unikt og beskrivende - hvis prosedyren er global, trenger du ikke ønsker navnet til konflikt med noen annen måte i andre script. Jeg arbeider vanligvis en slags initialer i navnet, og fordi manuset vi skriver kalles "DoubleTransform", vil jeg gå med "dt" i dette tilfellet. På det mest grunnleggende, er dette den prosedyren vi bygger:
global proc dt_makeParentChain () {//handlinger av manuset};
Trinn 8
Det første vi ' ll gjøre med vår prosedyre er å definere en variabel som til slutt vil huse en liste over objektnavn. I MEL, er variablene merket med en dollar-tegn ($) før variabelnavnet. Det finnes flere forskjellige typer data som en variabel kan inneholde - tekststrenger, hel-tall kalt heltall, flyt desimaltall, vektor verdier, etc. Syntaksen for å erklære en variabel er dette:
datatype $ variabel;
for nå, vil vi lage en tom streng variabel:
string $ selectedObjects;
Hvis vi vil, kan vi også tilordne data til variabelen i samme linje med kode. Doble anførselstegn brukes til å definere tekststrenger.
string $ selectedObjects = "Dette er en tekststreng";
en enkelt likhets-tegnet betyr "sett variabelen til". En dobbel likhets-tegnet betyr "lik", og brukes når man sammenligner variabler.
Trinn 9
For å teste vår nye variabel, må vi legge til en utskrifts kommando. Dette vil generere en streng til Script Editor når skriptet kjøres. I dette tilfellet er vi rett og slett å skrive ut innholdet i variabelen '$ selectedObjects'
print $ selectedObjects;.
Trinn 10
Legg til en kommentar til den nye prosedyren. Jeg pleier å legge til en kommentar før hver prosedyre, slik at jeg raskt kan finne dem senere. Noen av mine scripts har dusinvis av prosedyrer, og kommentarene gjøre prosessen med feilsøking og endre koden mye enklere. Hele koden skal nå se slik ut:
//Gjør Parent Chainglobal proc dt_makeParentChain () {string $ selectedObjects = "Dette er en tekststreng"; print $ selectedObjects;};
Trinn 11
Lagre filen og gå tilbake til Maya. Når Maya først starter opp, skanner det skript katalog og laster en liste over alle filene der. Hvis du har lagt til et script til katalogen mens Maya er allerede åpen, vil systemet ikke vet at filen finnes. I dette tilfellet har du to alternativer, enten starte Maya, eller du kan bruke "rehash" -kommandoen til å tvinge Maya å oppdatere listen over filer. Vi vil bruke den andre metoden, så gå til "Window > Generelle Editors > Script Editor ', skriver du inn følgende:
rehash;
Nå trykker "Ctrl-Enter" for å kjøre kommandoen
Step 12
For å teste ut skriptet. , må du "initialisere" det i Maya. Den "rehash" kommandoen forteller maya at filen finnes, og "kilden" kommandoen forteller Maya å laste skriptet inn i minnet. Skriv følgende inn i script editor:
kilde EdW_DoubleTransform.mel;
Deretter skriver du inn kommandoen for prosedyren vi opprettet i skriptet:
dt_makeParentChain;
Dette er hva du bør få i skriptet redaktør etter å utføre inngrepet:
Step 13
nå som vi har satt sammen en fungerende prosedyre, la oss finne ut av pseudokode for hva vi ønsker at prosedyre å gjøre i vår endelige skript:
skrive en liste over utvalgte gjenstander til en variabel
få antall valgte objekter
forelder hvert objekt til den forrige i listen
Step 14
for å få en liste over objekter som er valgt i Maya synsfeltet, bruke listen kommandoen "ls". Listen er vanligvis brukes med et flagg som forteller kommando for å fange det som er valgt i maya synsfeltet, Sl. Prøv å velge noen objekter i maya synsfeltet, og skriv full kommando (vist nedenfor) i skriptet redaktør, må du huske å trykke "Ctrl-Enter" for å kjøre kommandoen
ls-Sl;.
Trinn 15
listen kommandoen utganger en haug med strenger som representerer den fullstendige listen over utvalgte stedene. For å gjøre denne informasjonen nyttig for oss, må vi skrive resultatet av "list" kommandoen til en variabel. For å gjøre dette, pakk listen kommandoen i tick-merker (Merk, tick-mark, også kalt en backquote, er vanligvis plassert over tab-tasten på tastaturet ... pass på å ikke bruke single-sitat-merket neste å enter-tasten). Innpakning en kommando i tick-merker settes som "produksjon av". Vår kommandoen skal nå se slik ut:
string $ selectedObjects = `ls -sl`;
Step 16
variabelen $ selectedObjects er et enkelt tekststreng. Det vi virkelig trenger er noe som kalles en streng array - en sortert liste over strenger som finnes i en enkelt variabel. For å gjøre vår streng i en streng array, bruker hakeparenteser når erklære den variable: Search string $ selectedObjects [] = `ls -sl`;
Nå, når vi refererer til variabelen, vi kan bruke enten hele matrise:
$ selectedObjects //alle strenger i matrisen
... eller et individ streng inne i matrisen, ved å tilføre en indeks - plassering av strengen vi ønsker innenfor matrisen selv. Indeksverdiene i MEL alltid starter på null, som vist nedenfor:
print $ selectedObjects [0]; //Returnerer den første strengen i arrayprint $ selectedObjects [2]; //Returnerer den tredje strengen i rekken
Step 17
Vi trenger også en måte å finne ut hvor mange gjenstander er i rekken. Du kan bruke "size" -kommandoen til å gjøre nettopp det. La oss lage en ny variabel for å lagre denne informasjonen. En hel rekke er representert ved et heltall, som alltid er henvist til i MEL som en "int":
int $ numSelectedObjects = `størrelse ($ selectedObjects)`;
Step 18
nå trenger vi en måte å overordnet hvert objekt i henhold til sin plass i rekken. Det er en håndfull måter å gjøre dette, men for nå vil vi bruke en enkel "for" loop. For-løkker er vanlig i programmering som en måte å gjøre en handling en rekke ganger. Syntaksen til en for-løkke som går ti ganger er dette:
for (int $ i = 0; $ i < 9; $ i ++) {//tiltak som skal gjøres;}
Loopen strukturen har tre deler. $ I = 0 definerer et heltall variabel, $ i
for ($ i = 0; $ i < $ numSelectedObjects; $ i ++) {//handling som skal utføres};
Trinn 19
Vi trenger nå å bruke en "forelder" kommando for å opprette hierarkiet kjeden. Syntaksen for kommandoen er som følger:
forelder childObject parentObject;
Så i vårt tilfelle, ville den overordnede kommandoen være:
for ($ i = 1; $ i < $ numSelectedObjects; $ i ++) {foreldre $ selectedObjects [(i-1)] $ selectedObjects [i];};
Step 20
Med vår løkke ferdig, nå trenger vi å oppheve siste objektet i utvalget, ved hjelp av "velg" kommandoen med "velge bort" flagg. For å beregne indeksen for det siste objektet valgt, tar vi det totale antall objekter, og da, fordi indeksen for noen array i Maya begynner på 0, trekker 1.
velge -deselect $ selectedObjects [($ numSelectedObjects - 1 )];
Trinn 21
Og med det, er vår første prosedyren nå fullført:
//Gjør Parent Chainglobal proc dt_makeParentChain () {string $ selectedObjects [] = `ls - sl`; int $ numSelectedObjects = `størrelse ($ selectedObjects)`; for ($ i = 1; $ i < $ numSelectedObjects; $ i ++) {foreldre $ selectedObjects [($ i - 1)] $ selectedObjects [$ i]; }; Velg -deselect $ selectedObjects [($ numSelectedObjects - 1)];};
Step 22
Under 'dt_makeParentChain', opprette en ny prosedyre for å unparent de valgte objektene. Koden nedenfor foreldre de valgte objektene til verden, som er det samme som un-foreldre dem
global proc dt_unParentSelected () {forelder w.; };
Trinn 23
Vår tredje prosedyre vil automatisere prosessen med å flytte et objekt dreiepunkt til opprinnelsen. Akkurat som før, starter vi ved å skape prosedyren disposisjon:
global proc dt_pivotToOrigin () {//prosedyre handlinger};
Trinn 24
Vi bruker da samme teknikk som i første prosedyren til å skrive en liste over de valgte objektene til en variabel: Search string $ selectedObjects [] = `ls -sl`;
Step 25
Vi trenger nå å legge i en loop. Mens vi kunne bruke samme type for-løkke som i det første manuset, la oss bruke en for-hver sløyfe i stedet. A "for-hver" sløyfe er en spesialisert versjon av for-sløyfe som utfører en gang for hver verdi i en matrise. Den lar deg også skrive en variabel som representerer den aktuelle indeksens verdi. Syntaksen ser slik ut:
for ($ hver i $ arrayVariable) {//gjøre denne handlingen med $ hver;}
hver variabel $ inneholder verdien av den gjeldende indeksen i matrisen. For vår script, dette er hva koden skal se ut:
for ($ thisObj i $ selectedObjects) {//flytte pivot på $ thisObj};
Den samme teknikken kan brukes til å automatisere noen maya kommando for en rekke utvalgte objektene
Step 26
Bruke $ thisObj variable kan vi nå velge objektet tiden blir sett-på av loopen.
velge -r $ thisObj;
Step 27
for å flytte pivot til opprinnelsen, kan vi bruke "XForm" kommandoen og nullstille -rp (rotatePivot) og -SP (scalePivot) flagg til 0 på X, Y og Z-aksen:
XForm -ws -rp 0 0 0 -SP 0 0 0;
Trinn 28
de viktigste komponentene i manuset er nå ferdig , og koden, som inneholder alle tre prosedyrer, skal se slik ut:
//Gjør Parent Chainglobal proc dt_makeParentChain () {string $ selectedObjects [] = `ls -sl`; int $ numSelectedObjects =` størrelse ($ selectedObjects) `; for ($ i = 1; $ i < $ numSelectedObjects; $ i ++) {foreldre $ selectedObjects [($ i - 1)] $ selectedObjects [$ i]; }; Velg -deselect $ selectedObjects [($ numSelectedObjects - 1)];}; //Un-Parent Objectsglobal proc dt_unParentSelected () {forelder w;}; //Flytt Pivot å Originglobal proc dt_pivotToOrigin () {String $ selectedObjects [] = `ls -sl`; for ($ thisObj i $ selectedObjects) {velge -r $ thisObj; XForm -ws -rp 0 0 0 0 0 0 -SP; };};
Trinn 29
Vi overvåker nå skal lage en fjerde prosedyre som skal bruke de tre foregående for å skape en interessant geometrisk progresjon kalt "Fermats Spiral", som bygger på vinkel forholdet det gylne snitt, phi. Det er en form som er ofte funnet i naturen, og det følger alle slags interessante geometriske regler. La oss begynne med å skrive ut pseudokode:
skape en sfære
lage 1000 eksemplarer
forelder-kjeden alle sfærer
flytte objekter i x-aksen
flytte alle sfære er dreiepunkter til opprinnelsen
roterer kulene i Y 137,5 grader (Golden Angle)
Trinn 30
Så, til å begynne med la oss lage en ny prosedyre disposisjon:
global proc dt_fermatSpiral () {}
Trinn 31
nå skal vi skape en sfære med åtte radiale og åtte høyde divisjoner, og skrive de resulterende transformere og form noder til en streng rekke, slik at vi kan holde styr på dem. De fleste kommandoer som skaper geometrien utgang to strenger - navnet på den trans node, og navnet på formen node. For det meste, vil du arbeide med å forvandle node strengen, som vil bli lagret i [0] indeksen i $ seedSphere rekke variable opprettet under:
string $ seedSphere [] = `polySphere -Sx 8 -sy 8`;
Step 32
Vi overvåker nå kommer til å opprette en tom streng rekke variable: Search string $ allSpheres [];
Step 33
Deretter åpner en for-løkke som går 1000 ganger:
for ($ i = 1; $ i < 1000; $ i ++) {
Step 34
Vi trenger nå å kopiere vår nyopprettede sfære, og skrive den resulterende transformere og form noder til en variabel:
string $ duplicatedSphere [] = `duplicate`;
Step 35
Her kan vi legge navnet på vår duplisert omdanne node til enden av $ allSpheres matrisen. Du kan bruke "size" -kommandoen til å bestemme hvor mange objekter er allerede i rekken, og bruke resultatet som indeksen for vår nye verdien
$ allSpheres [size ($ allSpheres)] = $ duplicatedSphere [0].;
Step 36
Her velger vi alle skapt kuler og kjøre den overordnede kjeden kommandoen vi laget tidligere:
velge -r $ allSpheres, dt_makeParentChain;
Step 37
Etter foreldre kulene sammen, velger vi dem igjen og flytte dem alle 0,05 i X ved hjelp av "flytte" -kommandoen:
velge -r $ allSpheres; flytte 0,05 0 0;
< h3> Trinn 38
Når du har tilbake opprinnelsen posisjon ved hjelp av vår tidligere opprettet "pivotToOrigin" prosedyre, velger vi kulene en siste gang, og rotere dem 137,5 grader i Y. Med det gjort, driver vår unparent script:
dt_pivotToOrigin, velg -r $ allSpheres, rotere 0 137,5 0; dt_unParentSelected;
Trinn 39
Og som fullfører vår endelige prosedyren. Så bør vår fulle script se slik ut:
//Gjør Parent Chainglobal proc dt_makeParentChain () {String $ selectedObjects [] = `ls -sl`; int $ numSelectedObjects =` størrelse ($ selectedObjects) `; for ($ i = 1; $ i < $ numSelectedObjects; $ i ++) {foreldre $ selectedObjects [($ i - 1)] $ selectedObjects [$ i]; }; Velg -deselect $ selectedObjects [($ numSelectedObjects - 1)];}; //Un-Parent Objectsglobal proc dt_unParentSelected () {forelder w;}; //Flytt Pivot å Originglobal proc dt_pivotToOrigin () {String $ selectedObjects [] = `ls -sl`; for ($ thisObj i $ selectedObjects) {velge -r $ thisObj; XForm -ws -rotatePivot 0 0 0 -scalePivot 0 0 0; };}; //Opprett Fermats Spiral av Spheresglobal proc dt_fermatSpiral () {string $ seedSphere [] = `polySphere -Sx 8 -sy 8`, string $ allSpheres []; for ($ i = 1; $ i < 1000; $ i ++) {string $ duplicatedSphere [] = `duplicate`; $ AllSpheres [size ($ allSpheres)] = $ duplicatedSphere [0]; }; Velg -r $ allSpheres, dt_makeParentChain, velg -r $ allSpheres; flytte 0,05 0 0; dt_pivotToOrigin, velg -r $ allSpheres, rotere 0 137,5 0; dt_unParentSelected;};
Trinn 40
< p> Og med det vi er ferdig! Lagre skriptet, og re-run 'rehash' /'kilde' prosessen som beskrevet ovenfor. Deretter skriver du inn følgende kommando i Maya script editor, trykk 'Ctrl-Enter "og vent noen sekunder:
dt_fermatSpiral ();
Og det du har Fermats Spiral, konstruert utelukkende ved hjelp av MEL. Prøv å spille med forskjellige vinkler, former og transformasjoner i sluttprosedyren - du kan få alle slags interessante mønstre!