目录
修穿插
借助VDB获得穿插点并调整
//利用VDB解决,非自身模型穿插
//如还有微小穿插,可对suface场减些值如-0.001;
//注意VDB的激活范围
float dist = volumesample(1, 'surface', @P);
vector dir = normalize(volumegradient(1, 'surface', @P));
if(dist<0)
@P -= dir*dist;
//利用VDB解决,自身模型穿插
//注意VDB的激活范围
vector sampleP = @P+@N*ch('offset');
float dist = volumesample(1, 'surface', sampleP);
vector dir = normalize(volumegradient(1, 'surface', @P));
if(dist<0){
@P += @N*ch('val'); //@P += @N*ch('val')*(dist+1);
@interset = 1;
}
使用detangle节点调整
先使用detangle节点初步解决穿插,在deltamush平滑;
案例
海盗角色布料
角色布料教程 CGCircuit - Houdini Vellum Creature Setup
- 导入abc(一般从maya种导出的,注意比例);
- 对有厚度模型,获取单面,用于解算;
- 碰撞vellum cloth,并解算;
- 用解算结果,驱动原模型;
- 导出abc(还原比例及保留path属性);
碰撞体处理
- 对处于碰撞的部分可使用peak先缩小在恢复,碰撞过渡;
- 对碰撞体自身穿插部分进行修理,拉开空间;
- 还可创建collisiongroup属性,忽略碰撞;
- 删除不参与碰撞的部分;
vellum处理
衣服
- 对双层布料,删除出单面解算(最后还原);
- 对原始布料本身纠缠穿插的区域,事先平滑处理;
- 可使用自适应remesh,对特定区域添加细节,如衣领;减低看不见的地方面数;
- 修复或disable和碰撞体穿插的区域;
- 使用PolyDoctor修复错误;
- 内部衣服应紧贴到身体,以给外面衣服留出足够空间,如使用attach约束(restlength=0.2);
- 对那些需跟随动画运动的区域,使用pin约束;
//删除扁平的三角形 float ratio_threshold = ch("ratio_threshold"); f@marea = primintrinsic(0, "measuredarea", @primnum); f@mperimeter = primintrinsic(0, "measuredperimeter", @primnum); f@ratio = f@mperimeter/f@marea; if (f@ratio > ratio_threshold) { removeprim(0,@primnum,1); }
- 纽扣
- 解算,则本身使用strut或shapematch保持形状,使用stitch约束到衣服上;
- 直接pointdeform;
腰带/皮带
- 对原始模型remesh,可使用cloth、strut约束保持形态(vellum configure strut softbody);可能会抖动,增加阻尼;
- 皮带配件,可忽略与皮带碰撞,stitch约束住;
- 与下层衣服交互时,为避免滑动穿插,可stitch约束住;
注:
- 耗尽能量才能收敛,窄的带子会降低能量消耗;
- 使用四面体约束Tetrahedral Stretch,解算慢,结果差;快速抖动是约束相互抗争的信号;
- 使用strut约束来设置如皮带、软管等细长mesh,又快又稳;
注
- 可使用额外的碰撞球,来控制运动方向等;
- 注意质量mass,尽量保持各个质量值相似,以便很好的碰撞;
- 0.1~1.0-e8相差太大,对layer shock设置;
- 1.0-e6~1.0-e8更相近,碰撞更好;
- 高的bend刚度,会引起解算不稳定,抖动,使用最低可接受的值;
- 增加mass,可强化bend刚度,即可降低刚度值;
- 增加Smooth Iteration对抖动有帮助;
- Tetrahedral Stretch约束要求许多约束迭代,适用于有机材质;
注,特别是stitch约束会涉及原动画模型的点位置信息,在解算前如对vellum缓存,由于解算的子步原因可能结果会出问题;
- stitch约束,Geo不可缓存,Con只需初始帧;
- attach约束,Geo、Con均只需初始帧;
deforming原模型
- 由于原模型初始状态不同部分的点可能过于靠近,在捕获的点时可能捕获到了其他位置的点,引起结果变形错误;
- 解决办法为对靠近的点,分为不同piece,从而分开捕获点;
- 先对原模型分不同部分piece;
- 在将piece传递给解算模型,此时传递的会有偏差(存在漏洞或间隔);
- 先将piece属性转化为组,在使用group expand节点收缩,在扩展,填充漏洞或间隔;