Maya中生成打湿贴图

以上是测试过程某一帧的截图,比较含蓄,动态效果在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的代码总是这么的精简,几乎完全不需要做算法以外的部分。


你可能感兴趣的:(CG+Programming)