Introduktion till MEL Scripting i Maya: 3D Fractals (6 / 7 steg)
Steg 6: MEL Script
Nu ska vi skriva en rekursiv funktion som implementerar fraktal algoritmen ovan nämnda. Det finns många sätt att genomföra detta, men jag ska visa det enklaste för att förstå (hoppas jag)!
Först förklara funktionen generateFractal, det tar ett par indataparametrar, en vektor, float och en int.
PROC generateFractal (vector $center, float $size, int $recursionLevel)
{
Vi skriver en check för att se vad rekursion nivå vi befinner oss i. Denna rekursion nivå hänvisar hur djupt vi är inom processen. När du skapar den första kuben vi är nivå 0, och sedan den andra uppsättningen av kuber (barn) sker, då vi är på nivå 1, etc. För våra ändamål vi vill ange en maximal rekursion djup och minska antalet tills vi når -1, först då slutar funktionen.
$recursionLevel-= 1;
IF($recursionLevel < 0)
{
hemkomst.
}
Nästa rad kommer att skapa en polyCube med en bredd, höjd och djup av $size, som är en av indataparametrar av funktionen generateFractal. Vi får se hur detta ställs i koden i lite.
polyCube -ch på -o på -w $size -h $size -d $size - cuv 4.
Vi flytta sedan kuben på plats. Kanske du tänker, oh vänta, behöver vi inte först välja kuben? Nope! Maya valt som standard det senaste objekt som skapas i scenen. Detta är praktiskt.
flytta - r ($center.x) ($center.y) ($center.z);
Nu ska vi beräkna den nästa kub(er) storlek och hur långt uppväga den från kuben göras vi bara (aka överordnade). Nästa kuben blir hälften så stor som överordnat, och kommer att kompenseras av en fjärdedel den överordnade storlek och hälften av sin egen storlek. Om det inte vettigt, oroa dig inte. När vi börjar köra den här funktionen för att generera fraktaler kan du spela med dessa nummer och se hur de påverkar den fraktala estetiska.
float $nextSize = $size/2,0;
float $offset = $size/4.0 + $nextSize/2,0;
Okej, har vi att beräkna center positioner för de nya kuberna som vi kommer att skapa. Vi har redan räknat offset så att nya positioner är lika med det tidigare centret, plus en förskjutning i rätt riktning.
vektorn $right = << ($center.x + $offset), $center.y, $center.z >>
vektorn $left = < <($center.x-$offset), $center.y, $center.z >>
vektorn $front = << $center.x, ($center.y + $offset), $center.z >>
vektorn $back = << $center.x, ($center.y - $offset), $center.z >>
vektorn $top = << $center.x, $center.y, ($center.z + $offset) >>
vektorn $bottom = << $center.x, $center.y, ($center.z - $offset) >>
Slutligen anropar vi funktionen generateFractal inom sig! Woohoo rekursion :) Observera att vi passerar funktionen nya positioner för de centra, storlek och rekursion nivå!
generateFractal ($right, $nextSize, $recursionLevel);
generateFractal ($left, $nextSize, $recursionLevel);
generateFractal ($front, $nextSize, $recursionLevel);
generateFractal ($back, $nextSize, $recursionLevel);
generateFractal ($top, $nextSize, $recursionLevel);
generateFractal ($bottom, $nextSize, $recursionLevel);
}
Samtidigt bygga och testa denna funktion, du kommer förmodligen att sluta med massor av kuber i din scen. Maya kommer sedan sakta ner och så småningom kraschar. Alltså innan vi genererar våra fraktal, vi ska fråga Maya efter eventuella objekt med prefixet pCube och ta bort dem. Detta ger oss en ren scen.
sträng $cubes [] = "ls"pCube *";
Välj $cubes;
ta bort;
Nu ska vi ställa de ursprungliga parametrar som vi kommer att vidarebefordra till vår generateFractal funktion! Vi centrera vår första kuben på (0,0,0) och börja med en storlek på 100 enheter, och vi ska gå 6 nivåer (faktiskt 7 räknar noll) djupt.
vektorn $startPt = << 0,0,0 >>
float $startSize = 100,0;
int $startRecursionLevel = 6.0;
Sedan kommer vi att ringa funktionen! Maya kommer hänga ut för en sekund och bearbeta det du har just sagt att göra. Maya kan frysa för en sekund eller tio. Oroa dig inte, det är helt normalt. Jag har hittat att 6 är den högsta nivån kan jag uppnå på min maskin innan jag blandar ihop Maya och få den att krascha! Att denna funktionen är som "ta det röda pillret"... Jag hoppas det blåser ditt sinne:
generateFractal ($startPt, $startSize, $startRecursionLevel);