Re: [ 3D ] MAYA的nHair問題
※ 引述《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
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):