Re: [ 3D ] MAYA的nHair問題

看板Digital_Art作者 (音樂盒vs垃圾桶)時間10年前 (2013/12/22 03:55), 編輯推噓2(201)
留言3則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《chordee (音樂盒vs垃圾桶)》之銘言: : ※ 引述《posen2012 (posen)》之銘言: : : 使用軟體:Autodesk MAYA2013 64x : : 版本:2013 : : 附加使用軟體:N : : 問題描述: : : 我使用nHair去製作頭髮 : : 我將模型長毛的區域獨立出來成為一個面片 : : 在面片模型上對面Create hair : : 這種方式很順利 : : 會在模型上產生毛囊節點(follicle shape)和曲線,然後這些節點會同時跟產生出來的 : : hairsystem shape做連結最後連到 : : pfxHair Shape變成我們所看到的毛髮 : : 而這些毛囊跟我們的面片模型是有連結關係的,當你移動模型或者對模型上的點做位移時 : : ,毛囊自然也會跟著移動, : : 如此一來做表情是OK的,因為只要針對面片去做變形就可以讓毛髮也改變位置。 : : 不過有時候我們直接對模型使用Create hair,所產生出來的曲線有時候調整非常費時, : : 所以常常會使用CV或EP curve 自己去畫出曲線的路徑然後對這些曲線賦予一個 : : hairsystem shape去產生毛髮, : : 可是這樣一來我就遇到了一個問題, : : 自己用曲線產生出來的毛髮,他的毛囊節點並不會跟模型做連結對應而且毛囊的位置也不 : : 在模型上, : : 也就是說即便你移動這些面片模型,這些你用曲線產生出來的毛髮,他們也不會受到影響 : : .... : : 我有嘗試將這些曲線所產生出來的毛囊節點一個一個跟模型做連結 : : 模型節點的worldMatrix[0] --> 毛囊節點的inputworldMatrix : : 模型節點的ouputMesh --> 毛囊節點的inputMesh : : 可是連完之後發現,這些曲線的毛囊仍然不會跟著模型走.... : : 抱歉我表達能力可能不是很好 : : 我只是想要問: : : 「自己畫的curve產生毛髮後,如何讓這些毛髮會因為模型的位移或變形也跟著位移、變 : : 形? 」 : : 已嘗試過方式: : : 將新曲線所產生的毛囊節點與模型節點相連,但失敗。 : 我之前的做法比較硬幹 : 我並沒有先做haisystem而是先搞定那些curve線 : curve的方向如果正確的話 curve.ep[0] 應該是線上最接近模型的一點 : 利用這一點的座標和closestPointOnMesh可以得到follicle應該獲得的UV位置 : follicle是可以自己用mel建立的:createNode follicle : mel做的事大概就是 : 建立follicle並且連結模型 : 找到curve.ep[0]的位置 (pointPosition) : 利用closestPointOnMesh把follicle放對位置 : 再把curve線parent到follicle底下 : 寫得好一次就可以把全部curve搞定 : 然後再對curve線做hairsystem : 這樣做的缺點是會有兩組follicle : 容易搞混 我花了點時間找到之前寫的mel 因為我很懶沒有寫UI所以需要的話可能得自己動手改 XD pSphereShape1是模型shape node的名稱要替換掉 除此之外只要把curve全選再執行這個mel curve應該全部都會跟著mesh動 string $ss[] = `ls -sl`; createNode closestPointOnMesh -n CPOM; connectAttr -f pSphereShape1.worldMatrix CPOM.inputMatrix; connectAttr -f pSphereShape1.worldMesh CPOM.inMesh; for ($s in $ss){ float $pos[] = `pointPosition -w ($s+".ep[0]")`; setAttr CPOM.inPositionX $pos[0]; setAttr CPOM.inPositionY $pos[1]; setAttr CPOM.inPositionZ $pos[2]; createNode follicle; string $fsa[] = `ls -sl`; string $fa[] = `listRelatives -p`; string $fs = $fsa[0]; string $f = $fa[0]; connectAttr -f ($fs+".outTranslate") ($f+".translate"); connectAttr -f ($fs+".outRotate") ($f+".rotate"); connectAttr -f pSphereShape1.worldMatrix ($fs+".inputWorldMatrix"); connectAttr -f pSphereShape1.worldMesh ($fs+".inputMesh"); float $u = `getAttr CPOM.result.parameterU`; float $v = `getAttr CPOM.result.parameterV`; setAttr ($fs+".parameterU") $u; setAttr ($fs+".parameterV") $v; parent $s $f; } delete CPOM; 當初我用的時後mesh和curve都在層級最外面 不過我想這應該不是太大的問題 還有closestPointOnMesh這東西有時候回傳的UV會很任性的黏著vertex 這是因為模型沒有freeze的關係 如果不能freeze就只能原地複製一個mesh來做freeze 然後迴圈外的shape node是複製出來的 迴圈內的才是真正要附著的shape node 希望可以幫到你 然後附帶一提 有時候我會用 warp deformer 的方式讓 curve 現跟著模型變形 只有在非常少量變形和位移的時候 (通常是短時間用完即丟的廣告案 敷衍一下XD 因為要是變形和位移一劇烈就會變成惡夢一場 而且還會讓檔案變得非常重 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.68.118.71

12/22 14:45, , 1F
真的太感謝了.. 其實我MEL很差 所以我昨天才土法煉鋼..
12/22 14:45, 1F

12/22 14:46, , 2F
乖乖的用預設產生的曲線辛苦的重新調整重做..
12/22 14:46, 2F

12/22 14:54, , 3F
其實本來心裡有底應該不會有人幫忙 想不到有熱心大大
12/22 14:54, 3F
文章代碼(AID): #1IjV92oE (Digital_Art)
文章代碼(AID): #1IjV92oE (Digital_Art)