给一个2W多faces的面片做布料是非常非常痛苦的。。我希望我走的时候开的nCache没有死机。。
以后有空要多研究下face machine的skin deformer,公司使用得很多,但是无奈这个收费软件不开源。。我也没看到节点使用说明。。
maya自带的curve和surface做为影响物不理想,而face machine自己重写了deformer,解决了这个问题。
给一个2W多faces的面片做布料是非常非常痛苦的。。我希望我走的时候开的nCache没有死机。。
以后有空要多研究下face machine的skin deformer,公司使用得很多,但是无奈这个收费软件不开源。。我也没看到节点使用说明。。
maya自带的curve和surface做为影响物不理想,而face machine自己重写了deformer,解决了这个问题。
目前的工作是我所喜欢的,因为是把我之前半年研究的东西,进行了实战,也进行了更多的优化。
所以也不会有什么东西可以写出来的。只能留下一些评论罢了。
华强之前做面部都是用TFM。虽然我的插件功能还没有足够健壮的,但是它的立足点以及扩展性比起TFM好得太多了。
做面部次控需要写那么多额外的节点么。非常神经质。
还有什么需要写的么。。大概还是那些吧。。
GraphEdit是DirectShow的一个IDE工具,其主要用处就是构建filter graph。
这是绿色单机纯净版,非常好用。
进入正题。我们现在的目的是用GraphEdit来给一个无声音的AVI视频添加audio。
首先打开GraphEdit,点击Insert Filters。找到DirectShow Filters这项
在这么多项目里,找到File Source(其实把avi文件直接拖进去也是一样,不过也许你的avi压制格式不能被解码就打不开了)
点击那个被挡掉了字母I的 Insert Filter
在弹出的窗口中选好文件。然后用同样的方式加载一个音频wav文件。结果如下:
然后,插入一个avi mux和file writer(file writer会弹出窗口让你选择一个保存路径)
接下来左键点avi那个方框的右边突出的那个点(pin),拖动,把它连到avi mux上的突出点上
连完后,程序自动生成一个avi splitter(如果程序有音频就会又多生成一个音频filter),可以看到avi mux又会生成一个新的突出点,把音频接过去。
然后把avi mux右侧的突出点pin连到 out.avi( file writer 这个filter)的in pin上。
最后结果:
然后我们点一下中间绿色的播放键
这样我们就生成了最后结果!
程序上的实现:
大致和官方文档Building the Recompression Graph差不多
但官方最后一步RenderStream的作用仅仅是把几个filter连起来,并没有run这一步。
想要让整个graph中的datas在filter之间流动起来,就要用到
IMediaControl来run,以及用IMediaEvent来waitForCompletion。
最后记得要IMediaControl来stop。文档上说如果没有stop,文件会有些不正常。
——————————————————————————————————————————————
最后,在混合使用openCV和directShow上。记得把directShow的include和lib引用放在openCV前面,不然应该会有问题。
最近做了个研究,就是如何把maya的2个playblast给拼接起来,比如说,我有2个camera生成的playblast视频,我来个横向拼接做成1个视频。
网上搜呀搜,搜到了openCV这个做视频处理的好东东,让我可以使用抽象程度非常高的类来做,完全忽略细节。
openCV的安装可以参考网上。
安装前提是要装CMAKE,用CMake对openCV做个处理。然后安装时先对总项目做个重新生成,然后在对install项目做生成,我之前没有对install做生成,就没有得到头文件。
用openCV来读取AVI的帧很简单
首先是初始化一个CvCapture(cvCaptureFromFile),然后我们就可以用cvGetCaptureProperty来得到视频的一些属性,比如长,宽,总帧数。
然后就用cvRetrieveFrame来取得帧。不过我使用cvGrabFrame先取得一个返回值(因为两个视频的帧数可能不一样)然后用cvQueryFrame来取得一个指向IplImage 结构的指针。
openCV的图片都存储在统一的IplImage里面。
所以我们可以用这个结构里面的数据来生成新的图片。
新的图片数据用:
IplImage* cvCreateImage(CvSize size, int depth, int channels)
来搞定。这里size就是CvSize(640,480)这种,深度我一般用IPL DEPTH 8U,channel就是通道数量,彩图一般3个通道RGB。
数据的复制需要用到
void cvSetImageROI(IplImage* image,CvRect rect);
ROI的用法就很像PS 里面的选框工具,我们给这个新image数据选定一个范围,然后把新数据就复制到这个范围里面。
void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);
src就是我们截图生成的数据,dst就是我们的新图片
数据复制完之后,记得resetROI,否则最后结果会只有ROI部分,其他部分被剪裁掉了。
我们就要生成新的AVI
新AVI需要一个writer来把图片写成avi的帧。
cvCreateVideoWriter,fourcc我用的是DIVX
然后循环的执行:
int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );
这样视频就搞定了。
音频就要另外搞定了,openCV是视觉处理库,不是音频。
目前打算用directshow而不用windows的VFM。directShow有封装的包,应该会写起来方便点。
来公司的第二个任务就是给一个猫加面部次级。
为了少刷一些权重,所以并没有采用骨骼作为影响物,而是采用nurbs曲线
我也尝试过用mesh和nurbs surface做影响物,不过他们的影响规则性并没有曲线好。
曲线还是有其劣势,其一就是它完全没有办法加上X轴旋转。。毕竟曲线是cv点来影响。。一条曲线的X轴转来转去米有任何CV点的位移。。
还有一个显著的缺点就是曲线两端cv点移动会影响整体,这个可以通过削弱权重和分段多曲线影响物来减少影响。
还是X轴旋转最让人头疼。。。
想要做次级X轴旋转,必须用曲面或者mesh,而mesh要做影响物,就必须足够大,否则边缘点的影响效果会反向。
足够大的话,骨点的权重就会更麻烦。
比如刷一个眼睛,我至少要刷8个骨点,还有1个面。而曲线的话,我要刷4根线,以及调整4个曲面上的一些权重,4个曲面是linear的,V向就2个点,所以调整起来很快。
虽然看起来2个方式的权重好像差别不会太大,但是最让人头疼的还是mesh没有柔软的感觉。
用骨点的话,必须要配合旋转,不然没法做到nurbs 曲线那种曲线过渡。
但是次级骨点要做旋转,这个工作量需要基本上翻倍。我需要刷一套旋转的权重,这个叠加效果还不一定好。。唉。。
————————————————————————————————————
那么。我在曲线影响物基础上,刷一套大范围mesh影响的旋转次级效果??然后叠起来咯,呵呵
这个可以研究下结合性。