顯示具有 polygon 標籤的文章。 顯示所有文章
顯示具有 polygon 標籤的文章。 顯示所有文章

2016年6月7日 星期二

切換邊界線的顯示 ( toggle border edges )


以下的 python script 可以切換邊界線 (border edge) 在 viewport 上的的顯示:

import maya.mel as mm
borderSize = 8
mm.eval("ToggleBorderEdges")
mm.eval("polyOptions -activeObjects -sizeBorder {}".format(borderSize))





















若要直接選邊界線的話則是執行以下這幾行程式:

import maya.cmds as mc
mc.softSelect(softSelectEnabled=0)
mc.polySelectConstraint(mode=3,type=0x8000,where=1)
mc.polySelectConstraint(disable=1)



2015年1月17日 星期六

python 小程式 : 使用一圈的線 + 一個點來選取一群面。





當我們需要選取某一塊模型面時都會常常遇到不小心選錯或漏選一些面的這種問題,尤其是像以上這種結構比較複雜的模型特別容易發生。
以下這個程式可以幫助我們快速選取 edge loop 裡的面,只要選取一圈的線加上一個圈裡的點 就可以轉換成那一圈裏的面了。

 (由於程式有點長 所以放到 github gist 方便大家瀏覽 + copy paste)

程式連結






打開連結後按下右邊的 RAW 按鈕就可以把程式複製貼到 maya script editor 裡執行 (或做成 shelf 按鈕 或 快速鍵)


2015年1月8日 星期四

python 小程式 : 安全複製模型面 不影響原本模型的 history 或 名稱




Maya 的 duplicate face 工能雖然不錯用,但複製完模型面之後原本的模型不管是名稱或是 history 都會受影響。名稱會變成 polySurface* ,node history 也同樣會加上polyChipOff,polySeparate 這種 node, 對有rigging 過或 reference 進來的模型都是一種困擾。因此,我前陣子寫下了以下這個小程 (python) 式可以避免這種副作用,複製後遠本那個模型不會受任何影響 !


import pymel.core as pm
import re

def getComponentId(component):
    """get id number from a component (i.e. pCube.vtx[12]) , and return as int (i.e. 12 ) ."""
    tokens = re.split('[\[\]]',str(component))
    
    try:
        return int(tokens[1])
    except (ValueError,IndexError):
        return -1

faces = pm.filterExpand(ex=True,sm=34)

meshNode = pm.ls(faces,o=1)[0]

dupNode = pm.duplicate(meshNode)[0]

idList = [getComponentId(fc) for fc in faces]

pm.select("%s.f[*]"%str(dupNode),r=1)

preStr = str(dupNode)+".f[%d]"

pm.select([preStr%eachId for eachId in idList],d=1)

pm.delete()

2011年4月19日 星期二

從多組模型線 (poly edges) 產生 相對的 曲線 (curves)




因為目前 Maya 的 edge 轉 curve 功能只能針對 一組相連的 edges 來做轉換,所以寫了一個 maya mel 程式來處理多組相連edges 的 case 。

下載 : www.brainyart.me/tools/scripts/files/rainCurvesFromEdges1.0.zip

安裝:
1. 把 rainCurvesFromEdges.mel 放到 maya script 資料夾裡。
2. 重開 Maya。

用法:
1. 選取一組或多組 poly 線。
2. 執行這一行程式碼 : source "rainCurvesFromEdges.mel";rainCurvesFromEdges();

2010年5月5日 星期三

複製 模型 UV ( Copy polygon UV )


以下的程式可以把一個拆好的UV 複製到其他 結構(topology)一樣的模型上. 什麼是結構一樣的模型?



使用方法:
  • 先選 UV 好的模型, 然後再選一個或多個要貼上UV的模型.
程式:

{
string $allObj[] =`ls -sl`;
string $source[];
$source[0] = $allObj[0];
string $target[] = stringArrayRemove($source,$allObj);

for($each in $target)
{
if(`polyCompare -fd $each $source[0]`==4 || `polyCompare -fd $each $source[0]`==12)
{
polyNormal -normalMode 0 -userNormalMode 0 -ch 1 $each;
polyTransfer -v 0 -vc 0 -uv 1 -ao $source[0] $each;
polyNormal -normalMode 0 -userNormalMode 0 -ch 1 $each;

}
else if(`polyCompare -fd $each $source[0]`==0 || `polyCompare -fd $each $source[0]`==8)
{
polyTransfer -v 0 -vc 0 -uv 1 -ao $source[0] $each;
}

}
}

2010年1月26日 星期二

Maya bonus tools 功能之一: 在畫面上顯示模型線之長度 (edge length HUD)

Alias/Autodesk 從早期到現在都會把 Maya 一些額外的功能包成一組叫做 Bonus tools 的工具. 每一個Maya版本都會出一組 Bonus tools. 這些是 Maya 團隊從各處收納下來的功能,可是又不想把它放進官方版裡的menu (管理,版權等等的原因), 所以才叫 "Bonus".

Maya Bonus tools 官方下載網站是在: http://area.autodesk.com/bonus_tools

下載&安裝完之後重開Maya通常Bonus Tools 就會出現在 Menu 上了 . 若沒出現的話,執行以下這幾行即可:

{

scriptJob
-permanent
-event "MenuModeChanged" "bonusToolsMenu";

bonusToolsMenu;

}


Bonus Tools 裡其實有蠻多實用的功能,其中之一就是顯示模型線之長度 (edge length HUD). 切換這功能的開關是在 Bonus Tools->Modeling->Toggle Edge Length HUD.


這功能還可以顯示多條線的總長度呢!


2009年9月27日 星期日

Mesh Transfer Attributes : 轉移 UV 和 形狀

Maya 裡頭的 Transfer Mesh Attributes 是個多功能的工具 . 其中一個最常用到的就是把一個polygon模型的uv "複製"到其他的polygon 模型. 神奇的地方是,不像Copy Mesh Attributes, 這工具不要求兩個模型必須一模一樣. 只要模型點的位子差不多,複製出來的效果應該都不差.
那這工具到底要怎麼用最有效呢?首先像剛所說的,我們必須把兩個模型的位子擺的差不多,貼越緊越好.
使用方法:
  • 先選uv來源模型,然後再選要被轉移/複製 UV 的模型.
  • 執行 Mesh->Transfer Attributes[].
    選項 :
    Vertex Position : 是否要轉vertex位子.
    Vertex Normal : 是否要轉vertex normal 方向.
    UV sets : 轉目前看到的uv 或所有的 uv set.
    Color sets : 轉目前看到的 vertex color 或 所有的 color set.
    Sample space : 計算對應點的方法 . 最簡單的就是用 世界座標(world space), 也就是要把兩個模型貼在一起.
    Mirroring : 計算對應點時是否要用映射模式.
    Flip UVs : 是否要把 UV 方向反過來.
    Search method : Closest along normal (使用 normal 來找對應點) 或 Closest to point (使用點的位子來找對應點).
  • 按下 Apply 或 Transfer.

uv來源模型 (source mesh)


目標模型(target mesh)




選項


transfer uv 結果


除了轉移/複製 UV 之外,這工具也可以用來做類似 shrink wrap / morphing 這種功能,也就是讓一個模型的形狀去逼近另外一個模型的形狀.使用方法跟以上的複製 UV方法一樣,只是把 Vertex position 打開 (on) 而已.






2009年7月5日 星期日

鏡射模型會遇到的問題之一 : normal 方向反了




當我們想把某一邊的模型鏡 (mirror)到另一邊的時候, 一個很常見的做法就是使用 duplicate special , scaleX 或 scaleY或 scaleZ 設成 -1 . 要小心的是如果你把 scale -1 的模型做 freeze transformation 或 輸出成類似 obj 格式的話, 你所鏡射出來的模型normal方向會是反的.


使用scale -1 來鏡射模型,然後執行freeze transformation


顯示模型 normal


射出來的模型normal會跟原本的模型normal相反

你如果 把 -1 的 scale freeze 成 1 的話, Maya 會自動把 (opposite) 屬性打開,讓模型方向看起來是對的,隨然它的normal其實是反的.


Maya自動把opposite attribute 打開


所以做完 freeze 之後,建議先把normal轉成正確方向 ,然後再把opposite 這屬性關掉. 這樣一來不管你要輸出成其他格式或用任何軟體來render 的話都不會有normal方向反的問題.



把normal轉成正確方向



把 opposite attribute 關掉

2009年6月10日 星期三

刪除 polygon 線的 "正確" 方法





當你想把polygon的某些線刪除的時候,最好不要用鍵盤上的Delete,原因是雖然這招可以"成功"地把線殺掉,但會留下無益的一些點.

使用鍵盤的delete殺線,可能會留下你不想要的點




比較正確的方法是執行 Shift + 滑鼠右鍵 -> Delete Edge . 執行的結果是除了線會被殺掉,原本會留下來的那些點
也不見了.


使用delete edge, Maya會自動把留下來的點也一起殺掉

2009年5月24日 星期日

快速 設定 Mental Ray Wireframe Render




建模師的作品集裡頭通常都會有所謂的 wireframe render,用來突顯該建模師的佈線控制能力. Maya 的 Mental Ray 有一個叫做 contour shader 功能可以用來 render 出 wireframe, 可是操作上對於不常用Mental Ray 的使用者來說可能不太直覺.

在這我介紹一個非商業免費使用的 Maya plugin 叫做 MultiTool, 裡面其中一個功能可以讓你輕鬆的把 Mental Ray Contour Shader 設定好,並且可以 render出 不錯的 wireframe render.

以下是 MultiTool 的 安裝與使用方法(針對 assign contour shader 功能):

  • 安裝完畢之後打開Maya,然後在 Windows->Settings/Preferences->Plug-in Manager 裡把 MultiTool 打勾.

  • 在Maya Menu Bar 上將會出現 Ticket 這個 Menu.
  • 點選你要render wireframe 的模型,然後執行 Ticket->MultiTool->Assign Contour Shader.
  • 按下 render. 別忘了把 render 軟體設成 mental ray. 你會發現除了該有的 render結果之外還會加上 polygon 的佈線. 不錯吧!

2009年5月11日 星期一

rainConnector : 輕鬆連結多個polygon 的點或線

rainConnector 這個小程式可以讓你快速的把多個點或線連接起來. 相對於Maya 的 Split Polygon Tool 功能的好處是, rainConnector 可以在 maya 2008 /2009 的 polygon smooth mode (鍵盤按 3) 操作,而且它也可以很準確的把線切在中間.

下載點 : highend3d

安裝 : 如何安裝 mel 程式

用法: 選取你要連的點或面然後執行 rainConnector.
(如何把 mel 程式做成shelf 按鈕)



2009年5月4日 星期一

計算 polygon 線長度 (edge length)

以下是快速計算 polygon 線長度的 mel 程式:

{
string $edge[]=`ls -sl`;
string $tmp[] =`polyListComponentConversion -fe -tv $edge[0]`;
string $vtx[]=`ls -fl $tmp`;
vector $p1 =`pointPosition -w $vtx[0]`;
vector $p2=`pointPosition -w $vtx[1]`;
print(mag($p2-$p1));

};

2009年5月1日 星期五

有趣的 backface culling 按鈕

有 一位 CGTlak 網友把 切換背面隱藏 (backface culling) 這功能做成一個按鈕. 你可能覺得這沒什麼特別的,可是有趣的是他的按鈕會隨著開或關狀態把按鈕的圖案也跟著切換。

按裝程式下載點


安裝方法:
  1. 把 cly_toggleCullingShelfButtonSetUp.mel 放到 Maya script 目錄 .
  2. 把 togglePolyCulling.bmp和togglePolyCullingOn.bmp放到 Maya icon 目錄
    (例如"C:\Documents and Settings\Rainmaker\My Documents\maya\8.5\prefs\icons" 裡)
  3. 打開或重開 Maya, 然後在 command line 執行 :
    cly_toggleCullingShelfButtonSetUp

執行完之後,在Maya目前的 shelf 上會出現一個按鈕. 這程式的用法是先把某個或多個 polygon 模型選起來,然後再按下那個按鈕.


backface cull 沒打開的狀態.



backface cull 打開的狀態. 你可以注意到現在的 icon 跟沒打開之前的 icon 是不一樣的.

2009年4月29日 星期三

Copy UV 注意事項

如果你想把一個 polygon 模型的UV複製到另外一個一摩一樣的模型的話, Maya 的 Mesh->Copy Mesh Attributes 就是你的好幫手. 可是你可能不知道的是,就算形狀,點數,線數,面數一模一樣的模型,也不見得可以成功的把 UV複製過去,因為Copy UV成功條件有三個:
  1. 兩個模型的點數,線數,面數是一樣的.
  2. 兩個模型的點順序和面順序是一樣的.
  3. 兩個模型的 face winding order 是一樣的.

face winding order

我們就拿以下三個 case 來做範例...



A, B, C, D 這四個模型的點數,線數,面數都一樣,形狀也一模一樣(除了 D 是反方向). 我們就用 Copy Mesh Attributes 來把 A 的 UV 複製到 B, C, D 看看吧.


case1 : A 複製到 B

A可以成功的把 UV 複製到 B, 因為 它們都符合 (1), (2), (3) 這三個條件.



case2 : A 複製到 C

A 和 C 雖然 符合條件 (1) , 但不符合條件 (2), 所以 Copy UV 失敗了. C 因為作過某些更動(裡如 split, combine 等等的動作) 使得 vertex order 或face order 變得跟 A 不一樣. 如果你遇到這種 情況的話就必須用其他方法複製(例如 Mesh ->Transfer Attributes),除非你手動寫程式把 順序轉回跟A 一樣 再複製.


case3 : A 複製到 D

A和D 符合 條件(1) , (2) ,可惜的是它們不符合(3), 因為 D 這模型是用 scale = -1 去複製的,導致它們的 face winding order 相反. 這種 case 常常發生 (在做對稱模型時健模師通常都會先做一邊然後用 scale = -1 來複製另一邊). 這樣的話如果你直接用 Copy Mesh Attribtues 也是會失敗(注意左邊模型D 手臂的貼圖很明顯是錯的). 好消息是這種 case 還有得救. 你需要執行以下四個步驟:

  • 先把 D 的 normal 翻轉 (Normal->Reverse). 執行這步驟之後,條件 (3) 就符合了.
  • 執行 Copy Mesh Attributes
  • Delete History.
  • 再把 D 的 normal 翻轉一次.

用完之後你會發現雖然出來的 UV 方向是反的 (D的 UV是紅色, A的是藍色), 但出來的貼圖變正確了.


網路上有一個拆 UV 軟體叫 Zebruv, 其中一個功能就是讓你可以輕鬆診對 case 1 和 case來Copy UV. 它可以自動判斷兩個模型是否相反的,然後再做適當的處理. 除此之外,它也可以做多個模型 UV 複製 (maya的 copy mesh attribute 只讓你一對一複製).

2009年4月27日 星期一

何謂 non-manifold 問題

簡單來說,一個模型被稱為 non-manifold 如果它不能被攤開成一片連續的2D 平面.


2-manifold geometry :可以攤開成一片連續的2D 平面



non-manifold geometry : 必須攤開多片連續的2D 平面


non-manifold 的模型通常會造成後續的許多麻煩,例如 bevel無效,subdivision 失敗, render 錯誤等等的問題,所以建模時必須注意並且盡量避免做出non-manifold模型.

基本上一個non-manifold 模型會有至少以下三個因素之一:

non-manifold edge : 一個線(edge) 連到三個以上的面



non-manifold vertex :
  • 兩個以上的面分享一個點卻沒分享任何線, 或
  • 造成 non-manifold edge 的點



lamina face : 兩個以上的面分享共同的點和線



如何用 mel 程式來偵測non-manifold問題.

non-manifold vertex:
{
string $selected[]=`ls -sl`;
string $nmv[] = `polyInfo -nmv $selected`;
if(size($nmv)>0)
{
select -r $nmv;
warning("polygon has non-manifold vertices");
}
};


non-manifold edges :
{
string $selected[]=`ls -sl`;
string $nme[] = `polyInfo -nme $selected`;
if(size($nme)>0)
{
select -r $nme;
warning("polygon has non-manifold edges");
}
};


lamina faces:
{
string $selected[]=`ls -sl`;
string $lf[] = `polyInfo -lf $selected`;
if(size($lf)>0)
{
select -r $lf;
warning("polygon has lamina faces");
}
};


Maya 的 cleanup 功能 (Mesh->Cleanup...) 可以自動幫你移除掉 non-manifold / lamina faces ,可是出來的結果可能不是你預期的,所以還是建議手動把這些問題解決.

2009年4月22日 星期三

Transfer maps: 轉移貼圖(texture)功能




Maya 的 transfer maps 可以把一個模型的貼圖 (或細節,或occlusion)轉到另外一個模型上. 模型彼此貼的越緊,轉出來的貼圖就會越準確.

範例:

左邊是Maya的標準 poly sphere, 右邊是 smooth 過後的 poly cube. 你可以注意到這兩個模型不管是面數,線型,和 UV 都不一樣 (但是大小跟位子是差不多的),所 pSphere1 的貼圖如果直接貼到 pCube1 上,效果就會很不一樣. 現在我們來把 pSphere1 的貼圖轉到 pCube1 上吧.





->執行 Rendering->Lighting/Shading->Transfer Maps[]





設定簡易說明:

*Target Mesh : 要接收新貼圖的模型(pCube1). 點選你要用的模型,然後按 add selected.
*Source Mesh : 原本已經有貼圖的模型 (pSphere1) . 點選你要用的模型,然後按 add selected.
*Output Map : 想要轉過去的貼圖類別.
  • 轉模型細節 : normal 或 displace
  • 轉貼圖顏色: diffuse 或 shaded
  • 轉透明度 : alpha
  • 轉occlusion : Ambient
我們現在只想用單存顏色,所以按下diffuse.
*Diffuse Color map & File format : 貼圖路徑 和格式
*Map width & height : 貼圖大小
*Transfer in : World space (兩個模型都在同一個位子上)
*Sampling quality :數值越大效果就越好,但會算越久
*Filter size : 轉出來的貼圖要比較 模糊(blur) 或 銳利 (sharp). 數值越大就會越 blur
*Filter Type : Gaussian (相對下最好的演算法)
*Fill texture seams : 轉出來的貼圖在 UV 邊緣上要多算幾個 pixel (避免render出來有接縫). 通常 4 到 8 個 pixel 就夠了.

->按下 bake 或 bake and close.




算出來的結果. pCube1 這個模型有了很類似 pSphere 的貼圖 !