镜花水月 Houdini to Krakatoa(h2k) & Mirroonce to Krakatoa (mx2k)1亿粒子
Simulation in Houdini with Pryo FX, rendering with franticfilms Krakatoa 1亿粒子渲染
更新一下最近镜花水月的开发进度,首先感谢周波(以下简称周老板)的Maya to Krakatoa(m2k),没有周老板的Maya 2 krakatoa我也不可能搞出这个镜花水月to Krakatoa和Houdini to Krakatoa。关键是。。要是不是因为周老板的提示,我都不知道Krakatoa有prt的文件数据结构帮助文件。然后周老板的代码也帮了很大的忙,主要是那段使用zlib压缩数据的过程。最后我都觉得自己2的不行,最早做测试的发现max不能读文件,还使劲的折腾了一个礼拜,给周老板添了很多麻烦,结果发现我忘记勾选“序列文件”了。Krakatoa默认是读序列文件的。。。
在这里首先给周老板的m2k做个广告。。
http://www.cnblogs.com/Jedimaster/archive/2009/08/03/1537927.html
这个就是m2k了,周老板最早实现的prt数据结构,用来写maya粒子到3d max的,不过这段代码有一个问题不知道实际使用是不是这样的,就是max的坐标系和maya不一样,好像max是笛卡尔右手坐标系,maya是标准的左手的。所以保存粒子属性的时候到max里面会有一些坐标轴向上的偏移错误,不过这个只要在代码里面修改一些就可以了。
接下来就是我的 Houdini to Krakatoa和 镜花水月 Mirroonce (Molecule Wave) to Krakatoa了 (mx2k)。一亿个粒子,用Houdini模拟,max渲染,总共是分成10次模拟,每次模拟近1千万个粒子,然后分10份导入max中。Houdini用一个POP模拟2次不同的效果可以修改POP节点上的seed属性。一般来说尽可能的把粒子发射器切开,然后,每次计算一个切片的发射器,保存成bgeo,因为POP的模拟是不需要做粒子和粒子间的通讯的。所以,一次模拟1000万粒子和4次模拟每个切片发射器上的250万粒子效果是完全一样的。
我的H2k还是基于文件的,Houdini写出geo文件序列,然后还是镜花水月的 GEO_fstream Class读取数据,转换成一个基于线性表的粒子系统,这个粒子系统调用PRT_ofstream Class写成PRT文件,最后在3d max中读取Houdini中模拟好的粒子,使用Krakatoa进行渲染,得到渲染效果。
粒子的插值部分现在只是实现了CPU上的,镜花水月 Mirroonce (Molecule Wave) 本身就是一个基于CUDA的粒子系统,所以插值理所当然的要用CUDA,当然这个还正在做,CPU上的插值是h2k用的,插值也是很简单的算法,估计也是最简单的Renderman 粒子DSO用的那种,就是对粒子进行最近点距离的搜索,然后以当前粒子为中心点,最近点距离作为半径,进行一个球体顶点填充。
我没有自己写kd-tree这种东西,因为Houdini本身已经提供了这样的功能,所以需要对粒子插值的时候,只要给粒子添加最近粒子半径这个属性就可以了,镜花水月检测到这个属性的时候会自动对粒子进行插值,返回可以保存成prt格式的粒子文件,也可以保存成Houdini的geo,未来应该可以支持RIB。(如果有这个计划做的话)。
我做插值的主要原因是因为Krakatoa的插值效果并不好,一方面用Krakatoa原生插值的功能,当插值比例大于1比10 的时候,粒子会出现莫名其妙的“水波纹”,(应该是过滤器的问题?)另外一方面Krakatoa的粒子插值和粒子的最近的粒子半径没有关系,他的插值效果很像Houdini的Point jitter这个功能,所以,有的时候,做了10倍粒子的插值,得到的并不是粒子密度变大的效果,而是一种粒子半径加大的效果。并且得到这样效果的成本也并不便宜。所以,我干脆放弃了这个,自己重新作了一个粒子插值用的函数。
现在的h2k支持krakatoa的大多数属性,包括color Normal和velocity等等。由于没有时间做成插件,或者写成带基本窗口的小应用程序,h2k现在还是通过C++在Visual Studio里面控制的。所以暂时不能共享给大家了,预计明年开始镜花水月会加入QT UI的开发。还有Python绑定到C++的工作,到时候Mirroonce就是真正意义上的一个独立的软件了。