国产成人精品高清在线观看99,国产免费久久久久久精品,三级韩国一区久久二区综合,特色特黄特爽特刺激的三级视频网,久久成人永久免费播放

暴雪國際動漫教育
  • 暴雪國際2024招生簡章
  • 暴雪國際2024招生簡章
  • 暴雪國際2024招生簡章
  • 暴雪國際2024招生簡章
在線咨詢 預約課程 網(wǎng)上報名
Maya建模教程

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

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

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

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

講Poly建模之前,需要復習一下以前的知識。

首先要復習一下數(shù)組(Array)
一群變量放到了一起,這群變量就成了一個數(shù)組變量。
不過這些變量不是隨便放的,每個變量都有一個房間,每個房間都有順次的門牌號,我們就是根據(jù)門牌號來訪問任何一個數(shù)組成員的。請看這個字符串數(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是字符串,指的是
當前的數(shù)組成員,等同于"string $obj = $objects[$i];"
 

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

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

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

 

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


對初學者來說,看到"-sm 34"后,總是很難聯(lián)想到多邊形的面。當然你可以用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后面的字(變量或表達式)代表返回值,也就是函數(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ù)是非預期的,就返回一個空數(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文件中使用,不能作為菜單和按鈕命令,不占用內存空間。

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

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

下面提供幾個多邊形建模常用到的函數(shù),因為后面經(jī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內置的,也是菜單命令,經(jīng)常用到。

 

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

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

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

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


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

 

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

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

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

// 轉換當前選擇為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語初解之二-多邊型建模篇在大師面前獻丑了)
a:有參函數(shù)
所謂有參函數(shù)是:
proc MyFn(int $a,$int $b);
{
.......
}
這樣的函數(shù)就是有參函數(shù),因為在MyFn的后面括號里有參數(shù)...
如果調用MyFn函數(shù)的話:
proc MyFn1()
{
MyFn();
.......
}
這樣即可調用

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

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

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ù),那該如何調用呢:
global proc string[] GetList()//
{
string $sel[]=`ls -sl`;
return $sel;
}
//
global proc MyFn()
{
string $print[]=`GetList()`;//這樣就調用了函數(shù)GetList,并把返回值賦予$print;
.....
}
 

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

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

關于MayaApi做一點補充。

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

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

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

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

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

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

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

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

繼續(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代表一個全局字符串變量,以前講過全局變量應當盡量避免命名沖突。maya中的全局變量都是以小寫字母"g"開頭,為避免沖突,本教程中的全局變量一律使用"m_"作為前綴。

 

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

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

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

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

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

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

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

第一步,我們需要做一點準備工作,要了解一下切割命令polySplit和邊的構造順序。

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

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

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

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

 1 2 下一頁 尾頁

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

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