Maya MEL Prosedyre modellering for Artists

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;.

  • -cellWidthHeight (-cwh) setter Bredden og høyden på hver enkelt celle.

    -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_getBounds vil bruke en XForm kommando og litt aritmetikk å returnere markeringsrammen minimumskrav, maksimumsgrenser, og gjennomsnitt

    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!