看同事在substance演示warp節點感受比較牛逼,推了下方程:網絡
SDF圖:spa
變形的圖:code
結果:blog
Houdini裏實現,第一步實現二維的gradient(sdf),造成二維的梯度場,由於必定要在uv空間操做,因此得在sop映射個uv.string
把求出來的梯度放到N屬性上。爲了方便的觀看向量.節點網絡:class
<1>map
grad節點是求二維的sdf的梯度float
這裏面的map 用的上面的sdf貼圖.im
// sample sdf texture float f_tex(string map;float u;float v){ vector ret = texture(map,u,v); return (ret.x+ret.y+ret.z)/3; } float du,dv; du = dv = 0.01; string map = chs("map"); float u = @uv[0]; float v = @uv[1]; // cal df/du float offul = clamp( u+du,0,1); float offur = clamp( u-du,0,1); float ul = f_tex(map,offul,v); float ur = f_tex(map,offur,v); float dfdu = (ur-ul)/ (2*du); // cal df/dv float offvl = clamp( v+du,0,1); float offvr = clamp( v-du,0,1); float vl = f_tex(map,u,offvl); float vr = f_tex(map,u,offvr); float dfdv = (vr-vl)/(2*du); @N = set(dfdu,0,dfdv);
這一步能夠獲得grad向量:lamp
<2>
advect_warp節點 是對你的顏色貼圖 執行對流變形的過程:
這裏面的map用的上面的棋盤格貼圖.
string map = chs("map"); float amp = -ch("amp")/100; //這裏的amp是變形強度,若是過大,會跟substance同樣獲得uv紋理重複的效果,這個值比較敏感,畢竟uv->[0,1]區間 float u = @uv.x + @N[0]*amp; float v = @uv.y + @N[2]*amp; vector ret = texture(map,u,v); @Cd = ret;
結果: