<th id="bwd7y"><progress id="bwd7y"></progress></th>
    <dfn id="bwd7y"></dfn>
        • <b id="bwd7y"></b>

              <noframes id="bwd7y"><menu id="bwd7y"><td id="bwd7y"></td></menu>
              1. 暴雪國際動漫教育
                • 暴雪國際2024招生簡章
                • 暴雪國際2024招生簡章
                • 暴雪國際2024招生簡章
                • 暴雪國際2024招生簡章
                在線咨詢 預(yù)約課程 網(wǎng)上報名
                Maya建模教程

                maya建模教程:多邊型建模篇

                編輯:張闖來源:暴雪國際教育發(fā)布時間:2010-08-03

                眾所周知,maya的多邊形建模能力是不如人意的,因此這時mel會派上很大的用場。相信很多人都用過一些輔助性的建模工具,例如MJPolyTools、BPT、icePolyTools、CPS、drawSplit、rockGen...我在教程中會對這些程序的關(guān)鍵功能的編寫方法作出詳細(xì)說明,希望大家能在掌握這些功能的基礎(chǔ)之上編寫出自己稱心如意的Poly工具。

                mel作為腳本語言使用非常方便,在工作中會很容易地把你的一些簡單想法付諸實踐。

                講Poly建模之前,需要復(fù)習(xí)一下以前的知識。

                首先要復(fù)習(xí)一下數(shù)組(Array)
                一群變量放到了一起,這群變量就成了一個數(shù)組變量。
                不過這些變量不是隨便放的,每個變量都有一個房間,每個房間都有順次的門牌號,我們就是根據(jù)門牌號來訪問任何一個數(shù)組成員的。請看這個字符串?dāng)?shù)組的例子:

                選擇幾個場景中的物體。
                mel語初解之二-多邊型建模篇

                // 獲取場景中的每一個物體,分別放入數(shù)組$objects的每個房間中
                string $objects[] = `ls -sl`;


                這時數(shù)組的狀態(tài)如圖所示。
                $objects可以看作是公寓的名稱,[]里的紅色數(shù)字為房間的門牌號,也叫作索引號(index)。數(shù)組的索引號總是從0開始的。也就是說$objects[0]為數(shù)組的第一個成員,它的值為"pSphere1";而$objects[1]為數(shù)組的第二個成員,他的值為"pCube1";以此類推。

                我們可以從數(shù)組中取值,例如:

                 

                string $obj = $objects[0];
                // 此時變量$obj的值為"pSphere1"


                也可以給數(shù)組的成員賦值,例如:

                 

                $objects[1] = "pBox1";
                // 此時數(shù)組$objects的值為{"pSphere1", "pBox1", "pCone1"}


                mel語初解之二-多邊型建模篇
                 

                要想遍歷數(shù)組中的每個成員,可以用for語句,有兩種方法。

                 

                // 方法一
                string $objects[] = `ls -sl`;
                for ($i = 0; $i < size($objects); $i++)
                {
                string $obj = $objects[$i];
                // do something ...
                }

                // 方法二
                string $objects[] = `ls -sl`;
                for ($obj in $objects)
                {
                // do something ...
                }


                [注] mel的for...in語句和JavaScript有所不同,$obj是字符串,指的是
                當(dāng)前的數(shù)組成員,等同于"string $obj = $objects[$i];"
                 

                再復(fù)習(xí)一下函數(shù)(Function)

                如果你編寫比較復(fù)雜的程序,就會發(fā)現(xiàn)有很多經(jīng)常用到的語句,這些語句經(jīng)常以相同的組合出現(xiàn)。這樣的語句編寫起來有些麻煩,看起來也不太直觀。為了提高工作效率,增加可讀性,我們可以使用函數(shù)把它們封裝起來。下面舉例說明。

                還記得前面講過的filterExpand獲取多邊形面的方法吧?

                 

                string $faces[] = `filterExpand -ex 1 -sm 34`;


                對初學(xué)者來說,看到"-sm 34"后,總是很難聯(lián)想到多邊形的面。當(dāng)然你可以用maya的全局變量$gSelectMeshFaces來替代34,不過這樣做有些麻煩。我們編一個新的函數(shù)來做與上面代碼同樣的事情。

                 

                proc string[] getSelFaces()
                {
                return `filterExpand -ex true -sm 34`;
                }
                // [注] Sel為Selected的縮寫


                有了這個函數(shù),我們以后再獲取多邊形的面時,就可以這樣寫:

                 

                string $faces[] = `getSelFaces`;


                也可以這樣寫:

                 

                string $faces[] = getSelFaces();


                return為返回的意思,proc后面的字代表返回值的類型,return后面的字(變量或表達(dá)式)代表返回值,也就是函數(shù)的輸出值。

                再看一個例子:

                 

                proc string[] getPolySel(string $type)
                {
                if ($type == "vert")
                return `filterExpand -ex true -sm 31`;

                if ($type == "edge")
                return `filterExpand -ex true -sm 32`;

                if ($type == "face")
                return `filterExpand -ex true -sm 34`;

                // 假如輸入?yún)?shù)是非預(yù)期的,就返回一個空數(shù)組
                string $null[];
                return $null;
                }


                想要獲取多邊形的面時,可以這樣寫:

                 

                string $faces[] = getSelFaces("face");


                或:

                 

                string $faces[] = `getPolySel "face"`;


                這回用到了函數(shù)的輸入?yún)?shù)(string $type),根據(jù)輸入?yún)?shù)的不同,產(chǎn)成不同的返回值。
                mel語初解之二-多邊型建模篇

                一個函數(shù)可以既沒有輸入?yún)?shù)也沒有返回值,也可以只有其一。參數(shù)可以是多個,返回值只能是一個。

                return語句執(zhí)行之后,后面的語句將不再執(zhí)行。例如:

                 

                proc myProc()
                {
                // 獲取選擇的物體
                string $objects[] = `ls -sl`;
                // 如果什么都沒選擇,就返回(什么也不做)。
                if (!size($objects))
                return;

                // do something ...
                }



                global proc和proc的區(qū)別

                proc局部函數(shù),局部函數(shù)只能在編寫這個函數(shù)的mel文件中使用,不能在其他mel文件中使用,不能作為菜單和按鈕命令,不占用內(nèi)存空間。

                global proc全局函數(shù),沒有proc那些局限。使用全局函數(shù)應(yīng)注意,函數(shù)名不能與Maya中已有的全局函數(shù)或mel命令相同,否則會把原來的覆蓋掉,可以通過使用函數(shù)名前綴來避免重復(fù)命名。關(guān)于全局函數(shù)的使用,最好了解一些Maya的運行方式。Maya啟動時一般只把指定scripts路徑中的*.mel文件名(*)載入內(nèi)存,這樣Maya運行時就可以調(diào)用這個文件中的同名函數(shù),而當(dāng)調(diào)用這個同名函數(shù)時,這個mel文件中的所有全局函數(shù)將被載入內(nèi)存,直到Maya退出。

                如果還不明白,那就統(tǒng)統(tǒng)使用global proc好了,沒什么大不了的。
                 

                下面提供幾個多邊形建模常用到的函數(shù),因為后面經(jīng)常用到,所以應(yīng)該熟練掌握,至少對于每個函數(shù)做什么事要很清楚。

                 

                // 獲取選擇的多邊形頂點
                proc string[] getSelVerts()
                {
                return `filterExpand -ex true -sm 31`;
                }

                // 獲取選擇的多邊形邊
                proc string[] getSelEdges()
                {
                return `filterExpand -ex true -sm 32`;
                }

                // 獲取選擇的多邊形面
                proc string[] getSelFaces()
                {
                return `filterExpand -ex true -sm 34`;
                }

                // 獲取選擇的多邊形UV點
                proc string[] getSelUVs()
                {
                return `filterExpand -ex true -sm 35`;
                }


                用法范例:

                 

                // 獲取選擇的所有面,存放到數(shù)組$faces[]中
                string $faces[] = getSelFaces();



                這四個函數(shù)是maya內(nèi)置的,也是菜單命令,經(jīng)常用到。

                 

                // 菜單命令:Edit Polygons->Selection->Convert Selection to Vertices
                // 轉(zhuǎn)換當(dāng)前選擇為頂點
                ConvertSelectionToVertices();

                // 菜單命令:Edit Polygons->Selection->Convert Selection to Edges
                // 轉(zhuǎn)換當(dāng)前選擇為邊
                ConvertSelectionToEdges();

                // 菜單命令:Edit Polygons ->Selection->Convert Selection to Faces
                // 轉(zhuǎn)換當(dāng)前選擇為面
                ConvertSelectionToFaces();

                // 菜單命令:Edit Polygons->Selection->Convert Selection to UVs
                // 轉(zhuǎn)換當(dāng)前選擇為UV點
                ConvertSelectionToUVs();


                這四個函數(shù)在maya的scripts/others目錄中,可以直接調(diào)用。

                 

                // 轉(zhuǎn)換當(dāng)前選擇為頂點,并獲取這些頂點的名稱
                global proc string[] getVerts()
                {
                select -r `polyListComponentConversion -tv`;
                string $result[]=`filterExpand -ex true -sm 31`;
                return $result;
                }

                // 轉(zhuǎn)換當(dāng)前選擇為邊,并獲取這些點的名稱
                global proc string[] getEdges()
                {
                select -r `polyListComponentConversion -te`;
                string $result[]=`filterExpand -ex true -sm 32`;
                return $result;
                }

                // 轉(zhuǎn)換當(dāng)前選擇為面,并獲取這些面的名稱
                global proc string[] getFaces()
                {
                select -r `polyListComponentConversion -tf`;
                string $result[]=`filterExpand -ex true -sm 34`;
                return $result;
                }

                // 轉(zhuǎn)換當(dāng)前選擇為UV點,并獲取這些UV點的名稱
                global proc string[] getUVs()
                {
                string $uvs[];
                $uvs=`polyListComponentConversion -tuv`;
                if (size($uvs) == 0) return $uvs;
                select -r $uvs;
                string $result[]=`filterExpand -ex true -sm 35`;
                return $result;
                }


                 

                // 根據(jù)點、邊、面、UV點的名稱得出多邊形的名稱
                // 例如多邊形一條邊的名稱為"pSphere1.e[637]",則這個多邊形的
                // 名稱為"pSphere1"
                proc string getBaseName(string $item)
                {
                string $buffer[];
                if ($item != "")
                {
                tokenize($item, ".", $buffer);
                }
                return $buffer[0];
                }


                用法范例:

                 

                string $polyName = getBaseName("pSphere1.e[637]");
                // 返回值:pSphere1


                 

                // 根據(jù)點、邊、面、UV點的名稱得出它們的索引號
                // 例如多邊形一條邊的名稱為"pSphere1.e[637]",則這個多邊形的
                // 索引號為637
                proc int getIndex(string $indexString)
                {
                string $buffer[];
                tokenize($indexString, "[]", $buffer);
                int $index = (int)$buffer[1];
                return $index;
                }


                用法范例:

                 

                int $index = getIndex("pSphere1.e[637]");
                // 返回值:637


                下面我為大家講解一下函數(shù)的幾個具體類型mel語初解之二-多邊型建模篇在大師面前獻(xiàn)丑了)
                a:有參函數(shù)
                所謂有參函數(shù)是:
                proc MyFn(int $a,$int $b);
                {
                .......
                }
                這樣的函數(shù)就是有參函數(shù),因為在MyFn的后面括號里有參數(shù)...
                如果調(diào)用MyFn函數(shù)的話:
                proc MyFn1()
                {
                MyFn();
                .......
                }
                這樣即可調(diào)用

                b:無參函數(shù)就是
                proc MyFn()
                {

                }
                這個就稱為過程了吧,反正是這樣的,就是沒有參數(shù),也沒有返回值,例如你要寫個UI的話,里面有菜單的話,假如很多很多,你可以單獨建一個函數(shù)專用來建菜單的函數(shù),然后在主函數(shù)里調(diào)用即可...

                c:有返回值的函數(shù),
                有返回值的函數(shù)也可以有參數(shù),也可以沒參數(shù),
                global proc int MyFn($int a,$int b)
                {
                return $a+$b;
                }
                這個就是含參數(shù)有返回值的函數(shù),注意在定義函數(shù)的返回類型時要時刻小心,假如你的返回值是float型,而定義的是int型的函數(shù),那他就會舍去小數(shù)點后面的數(shù)了雖然看上去不會出錯的,但是還是注意為好的..

                價如有個有返回值的函數(shù)是返回的一個場景里所有物體名稱的函數(shù),那該如何調(diào)用呢:
                global proc string[] GetList()//
                {
                string $sel[]=`ls -sl`;
                return $sel;
                }
                //
                global proc MyFn()
                {
                string $print[]=`GetList()`;//這樣就調(diào)用了函數(shù)GetList,并把返回值賦予$print;
                .....
                }
                 

                其實mel里的函數(shù)還是和c++里的函數(shù)有點類似的...
                獻(xiàn)丑了,希望各位前輩不要恥笑,在下也是為了大家能夠更好的學(xué)好mel
                .....
                下面在說說maya的API吧

                我想說的是其實api并非是多么困難的事情,為什么外國人能編寫那么nb的軟件呢,外國人能作到的,我門也能作到的......
                說道api,就是程序接口的意思,幾乎所有的大型軟件,可能都有api借口,什么是接口呀,還不是軟件專家為了更好的擴展自己的程序,也為了第三方軟件生產(chǎn)商能夠混上口飯吃.
                我門想擴展程序的功能,就要借助api,他是有一系列的頭文件組成的, 就是以h為后綴的文件,他里面把所有的類列舉出來,每個類是干什么的,他只把類的名稱寫出來,但不會把具體的代碼寫出來,不然的話,就泄密了....
                大家都知道c++的類是可以繼承的,我們編寫的maya插件就是以maya的各種類作為基類來擴展到我們想要的類,但是我門編寫的所有的類都是以MpxCommod為基類來擴展的....

                關(guān)于MayaApi做一點補充。

                MPxCommand不是所有類的基類,不過任何命令都是通過MPxCommand類的doIt()函數(shù)觸發(fā)的。

                MayaApi其實就是Maya提供的5個dll文件的編譯庫。這些庫中包含控制Maya的大量類和函數(shù),我們通過這些類和函數(shù)用vc++編寫自己的dll(mll)文件,這些函數(shù)通過Maya的方式(比如用mel命令的形式)來調(diào)用。

                MayaApi比mel更強大,更復(fù)雜,效率更高,能做到許多mel做不到的事情。MayaApi類的功能主要體現(xiàn)在以下幾點:
                1. 編寫mel命令。
                2. 執(zhí)行mel命令。
                3. 進(jìn)行創(chuàng)建物體,選擇、縮放、刪除等基本操作。
                4. 編寫manipulator。
                5. 編寫contexts(tool)。
                6. 編寫屬性節(jié)點。
                7. 編寫材質(zhì)節(jié)點。
                8. 文件輸入輸出。
                9. 編寫?yīng)毩⒌膃xe控制臺程序。

                MayaApi程序看起來是無所限制,因為使用vc++,可以使用WinApi,MFC,還有很多SDK。不過不能更改Maya底層的東西,不能更改Maya的運作方式。

                美工最好不要學(xué)MayaApi,因為編寫mel有可能提高你的工作效率,但編寫mll只可能提高別人的工作效率。想對MayaApi做一些常識性的了解倒是沒什么壞處。

                學(xué)習(xí)MayaApi,一定要先學(xué)vc++,最好先學(xué)WinApi+OpenGL編程。Alias在范例代碼中只提供了一些很基礎(chǔ)的、大家都知道的算法,價值不大。但由于MayaApi的學(xué)習(xí)資料甚少,這些代碼卻都是需要掌握的。如果你學(xué)了MFC,可以編寫Maya的外殼、Maya的播放器、Maya透明窗口、Maya窗口中玩游戲,不過這些好像對工作沒什么益處。

                [注] 以上指的是Windows版的Maya。
                 

                上一節(jié)講的函數(shù)看起來不太好懂,我也沒對代碼多作解釋,其實只要記住函數(shù)名和做什么用的就行了,也就是記住那些紅 字和對應(yīng)的綠字。

                繼續(xù)今天的課程,首先介紹一個有用的函數(shù)(intersectStringArray)。這個函數(shù)可以找到兩個數(shù)組的共同部分,比如數(shù)組1為{"兔子", "老虎", "山羊", "蟲子"},數(shù)組2為{"蟲子", "刀子", "梳子", "兔子", "珠子"},你可以獲得一個新數(shù)組包含它們的共同部分{"兔子", "蟲子"}。

                 

                // 獲得兩個數(shù)組的共同部分
                proc string[] intersectStringArray(string $array1[], string $array2[])
                {
                global string $m_arrayIntersector;
                if ($m_arrayIntersector == "")
                $m_arrayIntersector = `stringArrayIntersector`;

                stringArrayIntersector -edit -intersect $array1 $m_arrayIntersector;
                stringArrayIntersector -edit -intersect $array2 $m_arrayIntersector;
                string $result[] = `stringArrayIntersector -query $m_arrayIntersector`;
                stringArrayIntersector -edit -reset $m_arrayIntersector;
                return $result;
                }


                [注] global string代表一個全局字符串變量,以前講過全局變量應(yīng)當(dāng)盡量避免命名沖突。maya中的全局變量都是以小寫字母"g"開頭,為避免沖突,本教程中的全局變量一律使用"m_"作為前綴。

                 

                前面介紹過的函數(shù)可以看作是工具函數(shù),這些函數(shù)幾乎在以后的每個程序中都要用到。如果編寫某一功能,還需要編寫一些有針對性的專用函數(shù)

                現(xiàn)在我們來編一個多邊形的導(dǎo)角功能,來看看一個完整的程序是怎樣完成的。
                mel語初解之二-多邊型建模篇

                這是一些必須記住的單詞,相信所有學(xué)過Maya的人都不會感到陌生。

                單詞 縮寫 解釋
                polygon poly 多邊形
                vertex v;ver;vert;vtx 多邊形頂點
                edge e;ed 多邊形邊線
                face f 多邊形面
                split 切割
                index idx 索引

                要編寫一個比較復(fù)雜的程序,我們首先考慮的是應(yīng)該怎樣把這個程序做最大程度的簡化,要把一個龐大的東西拆成一小塊一小塊的分別去處理。

                今天我們需要完成第一小塊,就是當(dāng)你選擇一條邊時,程序可以在這條邊的兩側(cè)各切一刀,如圖。
                mel語初解之二-多邊型建模篇

                要做到這一點,需要分成四步。

                第一步,我們需要做一點準(zhǔn)備工作,要了解一下切割命令polySplit和邊的構(gòu)造順序。

                為了更直觀的說明程序的原理,我盡量多放一些插圖。

                選擇菜單Polygons->Create Polygon Tool,從左上角開始,畫一個正方形。
                這時看看mel歷史窗,可以看到polyCreateFacet命令,這個命令目前還用不到,先不去管他。
                mel語初解之二-多邊型建模篇

                依次選擇正方形的四個頂點,看看每個頂點的名稱和索引號。
                mel語初解之二-多邊型建模篇

                可以發(fā)現(xiàn)索引號是按照創(chuàng)建時的順序指定的。分別為0,1,2,3。
                mel語初解之二-多邊型建模篇

                 1 2 下一頁 尾頁

                上一篇:maya建模教程:利用貫穿動態(tài)拉出一造型物

                下一篇:maya建模教程:卡通螞蟻的制作

                草草久久久无码国产专区,国产精品一码二码三码在线,无码综合一区二区三区,在线播放午夜无码毛片
                <th id="bwd7y"><progress id="bwd7y"></progress></th>
                  <dfn id="bwd7y"></dfn>
                      • <b id="bwd7y"></b>

                            <noframes id="bwd7y"><menu id="bwd7y"><td id="bwd7y"></td></menu>