Maya中生成打湿贴图

来源:互联网 发布:淘宝试用不写试用报告 编辑:程序博客网 时间:2024/04/30 00:03

以上是测试过程某一帧的截图,比较含蓄,动态效果在http://v.youku.com/v_show/id_XMzEyNDM2OTgw.html

说一下制作wetmap的思路。


在maya中比较常见的是使用fluidTexture,3D or 2D,作为纹理,因为这两个纹理是唯一能用mel直接修改的纹理。总体就是粒子发射流体,造成的效果就是粒子在经过物体时会将对应位置改变着色,造成打湿效果。

这方法的弊端也显而易见了,不管是3D还是2D,对形变的物体的贴图的匹配都是个问题,而且最不堪的是voxel级的流体贴图质量不能和pixel级的文件贴图相比。


现在的这种方法就是直接使用了类似Realflow的文件贴图的生成。

(Maya除了lightmap等是不能写纹理的,但有了python就high了,知道我已经说过N遍了,但还是要说python太爽了,太high了~)

嗯。思路是这样的:


1.使用Python的PIL库来完成贴图的生成脚本。包含3个主要部分

  • frameLoop,用来在每帧迭代运行,在此函数可以让wetmap模糊、衰减、扭曲等。
  • drop,用来在指定位置打湿一滴。
  • merge,合成输出保存函数。(为了能够正常frameLoop贴图是分两层的,每帧迭代的只是wetmap层)

2.使用Maya的内置机构驱动起所写的py模块运行。

  • frameLoop用Expression
  • drop写到粒子的碰撞事件
  • merge写到Expression里,frameLoop之后。
源代码很简单,犹豫要不要放上来,因为对高手来说不发出来高手也会做,对新手来说,既然说了原理,放上代码就像直接把饭嚼好送到口中,让人失去咀嚼的乐趣了。


所以源码有需要的跟我说。就不放上来了~

把主要部分发上来吧:
init函数,用于读入贴图文件,比如滴溅的mask
addDrop函数,主要的drop函数。
def init():    global bg,blood,fg,wet        bg = _pi.open(kBG);    blood = _pi.open(kBlood );    fg = _pi.new('RGBA',bg.size,(0,0,0,0));
def addDrop(color,bg,drop_mask,x,y,rotate,size):    sizew,sizeh = bg.size    x*=sizew    y*=sizeh    bbox = (int(x-0.5*size),            int(y-0.5*size),            int(x-0.5*size)+int(size),            int(y-0.5*size)+int(size))    drop_mask = drop_mask.rotate(rotate,_pi.BICUBIC)    drop_mask = drop_mask.resize((size,size),1)    fg = _pi.new('RGB',(size,size),(color[0],color[1],color[2]))    bg.paste(fg,bbox,drop_mask)    return bg

不得不说,python的代码总是这么的精简,几乎完全不需要做算法以外的部分。