當(dāng)前位置:首頁>軟件教程>maya教程>教程內(nèi)容

mel語初解之二-多邊型建模(2)

來源: 作者:七月冰兒 學(xué)習(xí):4168人次
這是一些必須記住的單詞,相信所有學(xué)過Maya的人都不會(huì)感到陌生。

單詞 縮寫 解釋
polygon poly 多邊形
vertex v;ver;vert;vtx 多邊形頂點(diǎn)
edge e;ed 多邊形邊線
face f 多邊形面
split 切割
index idx 索引
    要編寫一個(gè)比較復(fù)雜的程序,我們首先考慮的是應(yīng)該怎樣把這個(gè)程序做最大程度的簡化,要把一個(gè)龐大的東西拆成一小塊
一小塊的分別去處理。今天我們需要完成第一小塊,就是當(dāng)你選擇一條邊時(shí),程序可以在這條邊的兩側(cè)各切一刀,如圖。

要做到這一點(diǎn),需要分成四步。

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

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

選擇菜單Polygons->Create Polygon Tool,從左上角開始,畫一個(gè)正方形。這時(shí)看看mel歷史窗,可以看到polyCreateFacet命令,這個(gè)命令目前還用不到,先不去管他。

依次選擇正方形的四個(gè)頂點(diǎn),看看每個(gè)頂點(diǎn)的名稱和索引號(hào)。

可以發(fā)現(xiàn)索引號(hào)是按照創(chuàng)建時(shí)的順序指定的。分別為0,1,2,3。

再看看每條邊的索引號(hào),也是按照創(chuàng)建時(shí)的順序指定的。一條邊有兩個(gè)點(diǎn),分別為起點(diǎn)和終點(diǎn),這兩個(gè)點(diǎn)決定了邊的構(gòu)造順序。

使用Edit Polygons->Split Polygon Tool在正方形上切一刀。

我們看一下polySplit的用法,-ep后面有兩個(gè)參數(shù),第一個(gè)參數(shù)(3)是邊的索引號(hào),第二個(gè)參數(shù)(0.263489)是百分比,如果邊的長度為1,切割點(diǎn)在邊的0.263489處。

切割點(diǎn)位置的受到邊的構(gòu)造順序的影響,以polySurface1.e[3]這條邊為例,從邊的起點(diǎn)開始,沿著邊的終點(diǎn)方向量出整條邊的約26%的長度,這個(gè)位置就是切割點(diǎn)的位置。

使用polySplit的一大難點(diǎn)就是判斷邊的構(gòu)造順序,也就是分清邊的起點(diǎn)和終點(diǎn)。為了做到這一點(diǎn),我們需要用到一個(gè)mel命令 - polyInfo

選擇一條邊線(e[3]),在命令行執(zhí)行"polyInfo -ev;",可以看到輸出結(jié)果"// Result: EDGE 3: 3 0 Hard",其中"EDGE 3:"代表邊線(e[3]),3和0分別代表組成這條邊的兩個(gè)點(diǎn)(vtx[3]和vtx[0])的索引號(hào)。注意,這兩個(gè)點(diǎn)的順序不是按大小排列的,而是按照邊線的構(gòu)造順序。

我們把polyInfo按照自己的需要封裝起來。主要是用字符處理的方法實(shí)現(xiàn)的,注意這里用到了一個(gè)前面講過的工具函數(shù)getBaseName()。你會(huì)發(fā)現(xiàn)這個(gè)函數(shù)的用途與getVerts()很像,但getVerts()無法得知邊線的構(gòu)造順序。

// 根據(jù)一條邊,得到這條邊的按構(gòu)造順序排列的兩個(gè)端點(diǎn)。
proc string[] edge2Vertex(string $edge)
{
string $verts[], $buffer[];
string $edgeInfo[] = `polyInfo -ev $edge`;
int $nbVertex = tokenize($edgeInfo[0], $buffer);

string $polyName = getBaseName($edge);
$verts[0] = $polyName + ".vtx[" + $buffer[2] + "]";
$verts[1] = $polyName + ".vtx[" + $buffer[3] + "]";
return $verts;
}
第二步,我們要找到需要切割的兩條邊。
我們可以根據(jù)選擇的一條邊,和要切割的那個(gè)面來判斷。
    選擇一條邊。Mel歷史窗中的代碼:  select -r polySurface1.e[6] ;

Edit Polygons->Selection->Convert Selection to Vertices,轉(zhuǎn)換成頂點(diǎn)。
[注] 這一步mel歷史窗中可能看不到變化,按z鍵undo一下就看到了。

Mel歷史窗中的代碼: ConvertSelectionToVertices;

再選擇Edit Polygons->Selection->Convert Selection to Edges,轉(zhuǎn)換成邊。

Mel歷史窗中的代碼: ConvertSelectionToEdges;

去掉開始那條邊的選擇。

Mel歷史窗中的代碼: select -tgl polySurface1.e[6] ;

[注] select -d polySurface1.e[6] ;也可。

[注] select -d polySurface1.e[6] ;也可。

現(xiàn)在剩下四條邊,可以用getSelEdges()把它們存到一個(gè)數(shù)組中。
數(shù)組1:
{"polySurface1.e[1]",
"polySurface1.e[3]",
"polySurface1.e[4]",
"polySurface1.e[5]"}

選擇要切割的面。Mel歷史窗中的代碼: select -r polySurface1.f[1] ;

用getEdges()把屬于面的四條邊存到另一個(gè)數(shù)組中。
{polySurface1.e[0],
polySurface1.e[1],
polySurface1.e[4],
polySurface1.e[6]}

用intersectStringArray()可以找到兩個(gè)數(shù)組的共同部分,就是我們將要切割的兩條邊。
{polySurface1.e[1],
polySurface1.e[4]}

用getEdges()把屬于面的四條邊存到另一個(gè)數(shù)組中。
{polySurface1.e[0],
polySurface1.e[1],
polySurface1.e[4],
polySurface1.e[6]}

用intersectStringArray()可以找到兩個(gè)數(shù)組的共同部分,就是我們將要切割的兩條邊。
{polySurface1.e[1],
polySurface1.e[4]}

把前面Mel歷史窗中記錄下的代碼整理一下,就成了:

// 已知一個(gè)面,這個(gè)面的一條邊,求與(這個(gè)面的)這條邊相鄰的兩條邊
proc string[] adjacentEdgesInFace(string $face, string $edge)
{
// 獲取所有相鄰的邊線
select -r $edge;
ConvertSelectionToVertices();
ConvertSelectionToEdges();
select -d $edge;
string $edges_vert[] = getSelEdges();

// 獲取已知面的所有邊線
select -r $face;
string $edges_face[] = getEdges();

// 求兩個(gè)數(shù)組的共同部分
string $edges[] = intersectStringArray($edges_vert, $edges_face);
return $edges;
}

			
			
		

學(xué)習(xí) · 提示

  • 一定要打開PS,跟著教程做一遍,做完的圖到這交作業(yè):提交作業(yè)
  • 建議練習(xí)時(shí),大家自己找素材,盡量不要用教程提供的素材。
  • 教程有看不懂的地方,可以到論壇發(fā)帖提問:新手求助
  • 加官方微信,隨時(shí)隨地,想學(xué)就能學(xué):ps_bbs,或掃右側(cè)二維碼!
  • 關(guān)注我們學(xué)更多,每天都有新教程:新浪微博 抖音視頻 微信小程序
- 發(fā)評論 | 交作業(yè) -
最新評論
暫無評論,交個(gè)作業(yè)支持一下吧~

關(guān)注大神微博加入>>

網(wǎng)友求助,請回答!