Character Setup   |   Downloads   |   Tutorials   |   Animations   |   Contact
MEL tutorial by Kjetil H Kulander

MEL (Maya Embedded Language) MEL tutorial av Kjetil H Kulander

MEL Skript/Uttrykk

Programmeringsspråket MEL brukes i hovedsak til to ting i Maya; Til å lage skript og uttrykk (expression). MEL skript brukes blant annet til å kjøre en kombinasjon av forskjellige kommandoer som gjøre noe i scenen, eller lager noe nytt. Et MEL uttrykk legger man på attributter for å gi attributtene verdier ut i fra forskjellige funksjoner og kommandoer. Man kan også gi attributter nye verdier med et skript, forskjellen er at med et uttrykk så vil verdiene oppdateres hele tiden slik at verdiene f.eks. kan oppdateres når man flytter seg på tidslinjen eller forandrer på en annen attributt. Et skript gjør kun forandring på verdier i det man kjører skriptet.

Det er viktig å huske at kodene man bruker i MEL skript og MEL uttrykk ikke er helt like.

Eksempel: Hvis man skal gi en attributt verdi basert på en annen attributt vil koden se slik ut:

script:

setAttr pSphere1.translateY `getAttr pCube1.translateY`;

expression:

pSphere1.translateY = pCube1.translateY;

MEL Kommando

En MEL kommando er en operasjon som gjør noe med scenen. Når man jobber i Maya kjøres det kommandoer i bakrunn. Ved å bruke historien i Script Editor kan man finne ut hvilke kommandoer som kjøres for å gjøre forskjellige ting i Maya. Mange av kommandoene i Maya har forskjellige "flags". Ved å bruke flags kan man gjøre forskjellige innstillinger i kommandoen. I Maya's "help" er en liste over de forskjellige kommandoene. Der kan man søke på kommandoer og se hvilke flags de har. Det er også ofte et lite exempel på hvordan de brukes.

Eksempel: Dette scriptet kjører kommandoen sphere med flag -r, -n, -p og -ax. -r setter radiusen til 5. -n gir objektet navnet "kule". -p setter pivotens posisjon til 0 5 0. -ax sier hvilken vei axene skal peke.

sphere -r 5 -n "kule" -p 0 5 0 -ax 0 1 0;

Variabler:

En variabel er en midlertidig lagringsplass for informasjon. Vi har forskjellige typer variabler: Vector, Float, Integer og String. Disse 4 variabel typene kan også være en "array". Det vil si at man har en tabell med flere verdier i samme variabel. En variabel lages ved å først skrive navnet på type variable, så navnet på variabelen som starter med $, så skriver man = og verdien den skal ha.

Eksempel: Dette skriptet lager en kule med tilfeldig radius fra 1-5. Først lages variabelen som er verdien som skal brukes som radius. Kommandoen som lager kula bruker så variabelen som radius.

float $radius = rand(1,5);
sphere -r $radius;

Prosedyrer og Funksjoner

Når man skriver et skript vil man skjeldent skrive alt i en sammenhengende tekst. Man deler det opp i forskjellige prosedyrer. En prosedyre fungerer som en kommando, slik at man kun trenger å skrive navnet på prosedyren for å kjøre denne delen av skriptet. Hvis man skal lage et vindu med en knapp vil selve vinduet være en prosedyre, mens kommandoen som kjøres når man klikker på knappen vil være i en annen prosedyre. En funksjon er en prosedyre som returnerer en verdi.

Eksempel: Man kan kjøre denne prosedyren ved å skrive IKDuplicate i Command Line. Da lages en duplikat med Input Graph.

global proc IKDuplicate()
{
duplicate -rr -un;
}

if/else

Med if/else kan man sjekke om en tilstand er riktig eller ikke, og kjøre forskjellige kommandoer basert på dette. Hvis man har et vindu med en avmerkingsboks; Når en kommando kjøres fra vinduet (f.eks. hvis man trykker på en knapp), kan kommandoen sjekke om avmerkingsboksen var merket eller ikke, og kjøre forskjellige kommandoer basert på dette.

Eksempel: Denne koden sjekker om et vindu eksisterer eller ikke. Hvis vinduet eksisterer slettes det før scriptet går videre. Hvis det ikke eksisterer hopper skriptet over alt som står innenfor if.

$windowExists = `window -ex $poseWindow`;
if ($windowExists == "1")
{
deleteUI -window $poseWindow;
}

switch

I likhet med "if/else" kjører "switch" forskjellige kommandoer basert på innholdet i en variabel. Forskjellen er at "if/else" sjekker en tilstand, f. eks. om en verdi er høyere enn en annen, mens "switch" kjører forskjellige kommandoer ettersom hvilken "case" i switchen den er lik. F. eks. kan man kjøre forskjellige kommandoer ettersom hvilken radioButton man har valgt.

Eksempel: Den første linjen sjekker hvilken radioButton som er valgt. "Switchen" setter scale variabelene til forskjellige verdier iforhold til hvilken radioButton som er valgt.

string $selectedMirrorPlaneInt = `radioButtonGrp -q -select $selectedMirrorPlane`;
switch ($selectedMirrorPlaneInt)
{
case "1":
int $scaleX = 1;
int $scaleY = 1;
int $scaleZ = -1;
break;
case "2":
int $scaleX = -1;
int $scaleY = 1;
int $scaleZ = 1;
break;
case "3":
int $scaleX = 1;
int $scaleY = -1;
int $scaleZ = 1;
break;
}

"for" loop

En loop bruker man for å repetere et sett med kommandoer. Antall ganger den skal repetere kan være en gang for hvert av objektene som er markert når skriptet kjøres.

Eksempel: Dette skriptet lister opp alle objektene som er markert og repeterer en gang for hvert av objektene. Variabelen $counter starter på 0 og øker med 1 hver gang loopen kjøres, når $counter ikke lenger er mindre enn størelsen på $objectsToPlaceLocator stopper loopen.

string $objectsToPlaceLocator[] = `ls -sl`;
for($counter = 0; $counter < size($objectsToPlaceLocator); $counter++)
{
float $objectsPosition[] = `xform -q -ws -t $objectsToPlaceLocator[$counter ]`;
spaceLocator;
move $objectsPosition[0] $objectsPosition[1] $objectsPosition[2];
}

Copyright 2005 Kjetil H Kulander
www.mrmotion.net