Maya MEL Prosedyremodeling for Artists - UiS
Denne opplæringen er en introduksjon til å bygge grafiske brukergrensesnitt (GUI) i MEL for Maya 2010 og under. Maya 2 011 introduserer en ny metode for å lage GUI som ikke vil bli dekket her. Vi kommer til å gå over riktig koding for UiS, feilhåndtering, og vi skal sette sammen et svært nyttig script som gir deg betydelig kontroll over et objekt dreiepunkt.
Brukergrensesnitt
Hvis du har planer om å gi dine skript til en annen artist, så det kan være utrolig nyttig å sette sammen et brukervennlig GUI som gjør koden tilgjengelig for ikke-programmerere. I disse dager, jeg bruker sjelden definerte hurtigtaster, istedenfor å stole på en håndfull av UiS som jeg har bygget i MEL å automat Maya prosesser. Jeg kan bære dem med meg, og trenger ikke å endre noen innstillinger for å jobbe komfortabelt på flere arbeidsstasjoner. Evnen til å skape og opprettholde UiS er et kraftig, men noen ganger frustrerende verktøy i MEL verktøykasse.
Trinn 1
La oss ta en titt på hva vi kommer til å være å skape i dag . Start med å redde "EdW_PivotControl.mel" -fil som følger med denne opplæringen til din scripts katalogen. Deretter åpner opp Maya. Jeg skal bruke Maya 2010 for varigheten av denne opplæringen, men den samme koden skal fungere for de fleste Maya versjoner. Skriv inn følgende i kommandolinjen og trykk enter:
kilde EdW_PivotControl; EdW_PivotControl;
Trinn 2
Vi bør ha et vindu åpent opp med et par knapper på den. Prøv å skape noen geometri og eksperimentere med manuset. Målet er å lage et skript som gir deg on-the-fly kontroll over objektet dreiepunkter.
Trinn 3
Legg ut hvilke rutiner vi må gjøre dette skriptet :
EdW_PivotControl - lanserer den viktigste prosedyren av skriptet
epc_pivotControl - skaper UI
epc_getBounds - bruke XForm kommandoen for å få markeringsrammen til den valgte innvende
epc_movePivotLocal - flytter objektets pivot til en lokal posisjon (y min, x min, etc.)
epc_movePivotToObject - flytter pivot til et annet objekt beliggenhet
Jeg bruker epc_ som min prefiks. Som i tidligere tutorials, vil du sørge for at prosedyrene har unike navn, slik som å ikke forstyrre andre scripts.
Trinn 4
Vi starter vår script ved å åpne opp det gamle standby, Microsoft Notepad. Den første prosedyren er enkel:
Trinn 5
Lagre ut 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_PivotControl.mel som min filnavn, men gjerne velge hva du vil.
Trinn 6
Nå får vi til den vanskelige delen. Opprette UiS i MEL har aldri vært en spesielt elegant prosess, så jeg skal gjøre mitt beste for å gjøre prosessen så smertefri som mulig. Noen ganger er det best å bare trekke noe ut på papir før vi begynner å skrive ut kode, så skissere en grunnleggende oppsett for hva du vil ha den endelige UI å se ut. Dette skriptet er ganske enkel, men når du begynner å forholde seg til faner, menyer, rullefelt osv du vil være sikker på at du har et spill-plan i tankene.
Trinn 7
< p> Vi kommer til å se på tre ulike typer av UI-kommandoer:
Windows - toppnivå objekter som har de vanlige knappene på alle OS-vinduet, for eksempel minimere, maksimere og lukke .
Layouts - ulike måter å organisere objekter innenfor en windows
Controls -.. knapper, slidere, tekstfelt, etc. Dette er de interaktive elementene i brukergrensesnittet
Her er en oversikt over våre skisse henhold til MEL kommandoer som brukes til å lage dem:
Trinn 8
Det første skrittet for å skape brukergrensesnittet er å etablere vinduet. Fordi vår vindusobjekt vil ha et unikt navn, kan Maya ikke ha to av samme vinduet åpent på en gang. Den første delen av vår prosedyre sjekker om vinduet er allerede åpen, og lukker den hvis det er
//Opprett UIglobal proc pivotControl () {. ≪ br /> if (`vindu -exists PivotControlMain`) {< br /> deleteUI PivotControlMain; < br /> }; //...};
Trinn 9
Nå, la oss prøve å lage et vindu i koden og se hva som skjer:
vindu -rtf en -t "Edw Pivot Control "-mnb en -mxb 1-w 450 h 300 PivotControlMain;
-resizeToFitChildren (-rtf) hvis sant, vil vinduet automatisk endre størrelse for å passe alle oppsett og kontrollerer du opprette
-title (-t) teksten vises i tittellinjen øverst i vinduet
-minimizeButton (-mnb) aktiverer eller deaktiverer minimer-knappen
-maximizeButton (-mxb) aktiverer eller deaktiverer påmaksimeringsknappen
-Bredde (w) bredden på vinduet i piksler
-Høyde (h) høyden på vinduet i piksler
Step 10
Akkurat nå har vinduet blitt opprettet i manuset, men en annen kommando er nødvendig for å vise det. Denne kommandoen vil alltid komme etter alt av UI-kommandoer for vinduet
Showwindow PivotControlMain;
Step 11
Våre full koden skal se slik ut:.
//Hoved Functionglobal proc EdW_PivotControl () {pivotControl;}; //Opprett UIglobal proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain, Showwindow PivotControlMain;};
Trinn 12
Kilde i det nye kode og kjøre det fra Maya kommandolinjen. Dette er hva du bør få:
kilde EdW_PivotControl; EdW_PivotControl; < span class = "tutorial_image" > < img src = "http://cdn.tutsplus.com/cg/uploads/legacy/249_MAYA_EdWhetstone3/6.jpg" data-original-url = "http: //cgtuts.s3.amazonaws.com/249_MAYA_EdWhetstone3/6.jpg "alt =" "border =" 0 "/> < /span >
Step 13
The Window er øverste objektet i vårt UI hierarki. Alle oppsett og kontrollene er barn av dette objektet. Det første oppsettet vi bruker er en layout kolonne, for å holde knappene:
columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout;
-adjustableColumn (-ac) kolonnen vil automatisk endre størrelse i henhold til bredden av vinduet
-rowSpacing (-RS) avstanden i piksler mellom hver rad i kolonnen
Trinn 14
Jeg har funnet ut at inkludert noen instruksjoner eller avklaringer innenfor UI kan gjøre manuset mer brukbar. Legge til en tekstkontroll til skriptet:
tekst -l "Flytt Pivot Til:";
label (l) selve teksten i kontroll
Step 15
Deretter ønsker vi å legge til en layout å holde knappene øverst i vinduet for å flytte de svinger rundt. En layout vi kan bruke er Gridlayout, noe som skaper et sett med jevnt fordelte celler som inneholder ett objekt hver
Gridlayout -cwh 60 24 -NRC 2 5;.
-numberOfRowsColumns (-NRC) angir antall horisontale rader og vertikale kolonner i nettet
Trinn 16
Hver celle i nettet kan inneholde en eneste kontroll. Disse blir automatisk fylt ut når du oppretter objektene under oppsettet. I vårt tilfelle ønsker vi å opprette ni knapper. Vi vil bruke -kommandoen flagget senere for å fortelle knappene hvilken prosedyre å ringe:
knappen -l "Center" -knappen -l "Y Min" -knappen -l "Y Max" -knappen -l "Origin"; knappen -l "Selected" -knappen -l "X Min" -knappen -l "X Max" -knappen -l "Z Min" -knappen -l "Z Max";
label (-l ) teksten som vises på knappen
Trinn 17
Nå trenger vi en måte å fortelle Maya at vi er ferdig med Gridlayout , og vi ønsker å legge til flere elementer til columnLayout. For å gjøre det, vil vi bruke en MEL kommando for å sette den overordnede av Gridlayout
setParent ..;.
..; indikerer at du ønsker å forelder til layout ett trinn opp i hierarkiet kjeden. Vi kan også bruke navnet på oppsettet, men dette er bare nyttig hvis alle oppsettene har eksplisitte navn:
setParent EPC_MainColumnLayout;
Trinn 18
Vår pivotControl script skal nå se som dette:
global proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain; columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout, tekst -l "Flytt Pivot Til:"; Gridlayout -cwh 60 24 -NRC 2 5 -Ag 1; knappen -l "Center"; knappen -l "Y Min"; knappen -l "Y Max"; knappen -l "Origin"; knappen -Jeg "Selected"; knappen -l "X Min"; knappen -l "X Max"; knappen -l "Z Min"; knappen -l "Z Max"; setParent ..; Showwindow PivotControlMain;};.
Step 19
Akkurat som Gridlayout, den columnLayout må være lukket ved å sette sin forelder
setParent ..;
< h2> Trinn 20
Kilde i manuset og se hva du får!
Trinn 22
UI prosedyren er gjort
//Hoved Functionglobal proc EdW_PivotControl () {pivotControl;}; //Opprett UIglobal proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain; columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout; tekst -Jeg "Flytt Pivot Til:"; Gridlayout -cwh 60 24 -NRC 2 5 -Ag 1; knappen -l "Center"; knappen -l "Y Min"; knappen -l "Y Max"; knappen -l "Origin"; knappen -Jeg "Selected"; knappen -l "X Min"; knappen -l "X Max"; knappen -l "Z Min"; knappen -l "Z Max"; setParent ..; setParent ..; Showwindow PivotControlMain;};
Step 23
Nå må vi lage koden for faktisk å flytte et objekt dreiepunkt. For å gjøre dette, vi kommer til å lage to prosedyrer som vil fungere sammen.
epc_movePivotLocal vil hente markeringsrammen informasjon ved hjelp epc_getBounds å flytte dreie steder
Step 24
Legg ut pseudo-kode for epc_getBounds:.
velg objektet gått fra epc_movePivotLocal
skrive resultatet av en spørres XForm kommando til en rekke
få gjennomsnitt av x, y og z minimumskrav og maksimumsgrenser returnert fra XForm
tilføye gjennomsnitt på retur rekke
returnerer markeringsrammen matrise sammen med gjennomsnitt
Step 25
< p> skape skjelettet for prosedyren, komplett med en returtype og bestått argument
global proc float [] epc_getBounds (string $ objSel) {};.
Trinn 26
. velg objektet vedtatt som et argument, og få markeringsrammen informasjon
global proc float [] epc_getBounds (string $ objSel) {velge -r $ objSel; float $ getBoundArray [] = `XForm -q -ws -bb `;};
-query (-q) spør kommandoen, i stedet for å faktisk forvandle noe
-worldSpace (-ws) sørge for at
-boundingBox (- bb) returnerer MIN og MAX posisjoner av markeringsrammen
-boundingBox flagg returnerer seks verdier i en matrise: x minimum, x maks, y minimum, y maksimum, z minimum, og z maksimum .
Step 27
beregne gjennomsnitt mellom minimumskrav og maksimumsgrenser. Husk at arrays alltid starte med en indeks på null
flyte $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) /2);. //Xmax pluss xmin delt twofloat $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) /2); //ymax pluss ymin dividert med twofloat $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) /2); //zmax plus zmin delt av to
Step 28
beregne gjennomsnitt mellom minimumskrav og maksimumsgrenser. Husk at arrays alltid starte med en indeks på null
flyte $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) /2);. //Xmax pluss xmin delt twofloat $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) /2); //ymax pluss ymin dividert med twofloat $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) /2); //zmax plus zmin delt med to
Trinn 28
Tilføy nyberegnede gjennomsnitt og returnere den endelige rekke
$ getBoundArray [6] = $ bbXAv;. $ getBoundArray [7] = $ bbYAv; $ getBoundArray [8] = $ bbZAv; returnere $ getBoundArray;
Trinn 29
Den endelige prosedyren skal se slik ut:
global proc float [] epc_getBounds (string $ objSel) {velg - r $ objSel; float $ getBoundArray [] = `XForm -q -ws -bb`; float $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) /2); float $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) /2); float $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) /2), $ getBoundArray [6] = $ bbXAv; $ getBoundArray [7] = $ bbYAv; $ getBoundArray [8] = $ bbZAv; returnere $ getBoundArray;};
Step 30
Nå kan vi sette denne koden for å jobbe inne i vårt epc_movePivotLocal prosedyre. Skriv ut pseudo-kode:
skrive en liste over utvalgte objekter til en rekke
få den informasjonen for hvert objekt valgte markeringsrammen, bruker epc_getBounds prosedyren
opprette en switch-case statement å kontrollere hvor dreie skal flytte til
Trinn 31
skape skjelettet for prosedyren. Sett opp en for-i loop slik at koden kjøres en gang for hvert objekt er valgt i scenen
global proc epc_movePivotLocal (string $ modus) {string $ sel [] = `ls -sl`.; for ($ thisObj i $ sel) {//kode går her};};
Step 32
Bruk prosedyren retur-verdien fra epc_getBounds å skrive en dupp utvalg:
float $ pos [] = `epc_getBounds $ thisObj`;
Step 32
Nå vil vi bruke en switch-case statement å faktisk flytte pivot rundt. Den grunnleggende strukturen i en switch-case er dette:
switch ($ variabel) {//variabelen kan være alle typer, inkludert strenger og flyter saken variableValue: //om variabelen kamper variableValue //kjøre denne koden pause; case otherValue: //kode her break;};
switch-case uttalelsen er en brusende system, noe som betyr at hvis du ikke tar med "break" kommandoen etter hvert tilfelle, vil resten av tilfellene utfører som godt. For vår prosedyre, vil vi legge til en switch-case som vil tillate oss å bruke samme fremgangsmåte for å flytte en pivot til mange forskjellige stillinger. Vår switch-case vil se slik ut:
switch ($ modus) {case "senter": CenterPivot $ thisObj; gå i stykker; case "YMin": flytt -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; };
Step 33
Fortsett å legge saker til manuset, slik at hver av våre UI knapper har en tilsvarende sak. Den fullstendige prosedyren skal se slik ut:
global proc epc_movePivotLocal (string $ modus) {string $ sel [] = `ls -sl`; for ($ thisObj i $ sel) {float $ pos [] = `epc_getBounds $ thisObj`; switch ($ modus) {case "senter": CenterPivot $ thisObj; gå i stykker; case "YMin": flytt -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "ymax": flytt -a -rpr $ pos [6] $ pos [4] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "opprinnelse": flytte -a -rpr 0 0 0 ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Xmin-": flytt -a -rpr $ pos [0] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Xmax": flytt -a -rpr $ pos [3] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Zmin": flytt -a -rpr $ pos [6] $ pos [7] $ pos [2] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "zmax": flytt -a -rpr $ pos [6] $ pos [7] $ pos [5] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; }; };};
Step 33
Vår siste prosedyre følger stort sett den samme ideen
global proc epc_movePivotToObject () {string $ selLast [] = `ls-Sl tail en. `; string $ copyToObj = $ selLast [0]; velge -deselect $ copyToObj; string $ Selset [] =` ls -sl`; float $ pivotSel [] = `XForm -q -piv -ws $ copyToObj`; print $ pivotSel; for (hver $ i $ Selset) {flytte -a $ pivotSel [0] $ pivotSel [1] $ pivotSel [2] ($ hver + ".rotatePivot") ($ hver + ".scalePivot"); };};
Det er bare to nye flagg i denne prosedyren:
tail (-tl) bare skriver det siste objektet valgt til array (ls kommandoen)
-pivot (-piv) spør den nåværende plasseringen av pivot på et objekt (XForm kommando)
Trinn 35
Nå er alt som gjenstår er å gjøre våre knapper i UI faktisk ringe prosedyrene vi har skrevet
knappen -l "Center" -c "epc_movePivotLocal center" -knappen -l "Y Min" -c "epc_movePivotLocal ymin."; knappen -l "Y Max" - c "epc_movePivotLocal ymax" -knappen -l "Origin" -c "epc_movePivotLocal opprinnelse" -knappen -l "Selected" -c "epc_movePivotToObject" -knappen -l "X Min" -c "epc_movePivotLocal xmin" -knappen -l "X Max "-c" epc_movePivotLocal xmax "; knappen -l" Z Min "-c" epc_movePivotLocal zmin "-knappen -l" Z Max "-c" epc_movePivotLocal zmax ";
-kommandoen (c) samtaler en kommando eller en liste over kommandoer når du trykker på knappen
Step 35
Og vi er ferdig!