作者chordee (音乐盒vs垃圾桶)
看板Digital_Art
标题Re: [ 3D ] MAYA的nHair问题
时间Sun Dec 22 03:55:42 2013
※ 引述《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
1F:推 posen2012:真的太感谢了.. 其实我MEL很差 所以我昨天才土法炼钢.. 12/22 14:45
2F:→ posen2012:乖乖的用预设产生的曲线辛苦的重新调整重做.. 12/22 14:46
3F:推 posen2012:其实本来心里有底应该不会有人帮忙 想不到有热心大大 12/22 14:54