Houdini中总结Volume Lattice的方法

这两天挪威大神不在,感觉有点寂寞。刚刚学习完他的一个牛逼工具Volume Lattice。鉴于他直接把这个工具已经拿到Orbolt里面卖钱了,我在这就只讲讲自己的学习理解,代码什么的就不在这上了,何况要是理解了方法其实零代码也能够自己实现出来。这里是他的工具连接,给这位牛逼的外国师傅做做广告:Volume Lattice

效果图:

这个工具的思路主要是使用点云来代替voxel,通过拉伸点云之后,求出每个点的位移向量,再把这个向量值转变为体积,最后使用这些向量来计算density新的位置。

制作步骤这样的:
1:在需要拉伸的volume里面均匀随机的撒上点,这里可以使用PointFromVolume和PointJitter来完成,密度可以是和需要变形的volume分辨率相关,当然还有很多别的方法,自己玩吧。这样算是完成了将volume暂时转化为点云的过程,其中点云的密度与之后拉伸的精确程度相关性不是特别大,因为晶格变形的时候我们的晶格控制点也不会太多,但是点云数量也不能过于稀疏。另外如果需要做变形动画的话,建议还是把点云数量开高一点,要不然动画的时候会有抖动。
2:通过自带的lattice来拉伸点云。这里挪威大神自己做了一个节点来完成这一步,仔细分析完之后其实就是lattice里面的Liner Interplolation,虽然个人觉得自己再写一个确实有点多次一举,但是学习的乐趣就在于总能发现一些以前从来没接触和了解的东西。为了了解他的方法,我找到了wiki里面对于双线性插值的方法(bilinear interpolation),了解到只要我们使用的是通过盒子来做Lattice的方法其实就是传统图像学里面插值方法的一种,最常见效率和效果平衡最好的是三线性(因为我们有三个维度)插值方法,另外还有spline插值方法,Houdini的lattice里面对于比较柔和的插值方法使用的是Bezier插值方法。

下面的图解释了双线性插值在平面维度的原理,图有点简单纯靠悟性了,如果不懂这里是wiki链接:Bilinear Interpolation

3:言归正传,做好点云的lattice之后,用wrangle也好还是vop也好,把每个点对应的位移displace计算出来并写到被变形后的点云里面。用变形后点云的Bounding Box来生成类似步骤1的点云,把拉伸后点云的displace传递给新点云,这样displace就以点云的形式充满的新的box,再用VolumeFromAttrib把displace变为volume值。值得一提的是因为不论怎样点也是不会完全填充在体积里面的,所以当直接把Attrib转换给Volume后,其实Volume里面该值是很不均匀的,在同一个切面下有些地方有,有些地方完全没有。这种情况下就需要使用Volume Blur来把数值做个均匀,测试的结果是使用两层blur效果比较好,第一次将没有数值的地方使用Minimum来填充上,第二次是用Average的方法让数值变化更加柔和。其实blur的效果好不好直接决定了之后Volume变形的效果好不好,因为这个步骤才真正意义上把变形的数据填充到了整个volume里面:

4:新的box大小就是变形后volume的大小。依照这个大小新建一个空的volume,在vop或者warngle里面用Pos先读取displace的volume值得到一个向量v,所以我们知道当前Pos的density值的位置是在原来Pos - displace的地方。就着算出来的这个向量值在原来没有变形的volume里面取出density值赋予到这个新box在pos的位置上。这样就完成变形了。

总结一下:
关于volume里面的值是和sop里面几何体下面的值是有很大区别的,voxel和点的区别在于,当volume的盒子和division确定后每一个voxel就是固定的死的,这个有点像我们显示器上的像素点,数据(颜色值之于像素点)变与不变与voxel无关,它只负责表现出来。而点的所有数值是跟着点走的,而点的位置也是通过P的变量写在自己身上的,所以针对与某一位置的数据如果是在点上,不论位置怎样变换,我们只要找到那个点就能拿到所有的数据,这样通过点为媒介我们可以说某一个值变换了位置。而在voxel里面,所有的数据都没有一个像点一样的ID来确定当前voxel里面的值是从哪转移来的。解算出来的rest在一定程度上可以充当这个ID,但是也不是绝对的稳定,这也是为什么pyro solver里面会有一个rest2来当替补融合rest。另一种方法就是从volume中附带的vel速度来估计其它值是怎样转移的,但毕竟帧与帧之间我们只能以线性匀速来估计,但是解算的时候速度肯定不是线性的而且大部分时间也不是均匀的。

时间: 2024-10-11 17:16:35

Houdini中总结Volume Lattice的方法的相关文章

Houdini中角色通用修穿插方法

公司特效组最近一半的人一直都在做着修穿插这样的一个重复的事情,听说来公司之前大家也都一直这样做着,这种完全不能把艺术家从重复劳动中解放出来的状态确实有点让人神伤.最近本人也在做着这方面工作,想借着这个机会,总结一下自己这方面的经验,也重点探讨一个能够适用常规多数角色穿插问题的解决方法.希望能做到抛砖引玉的效果. 首先聊一聊角色动画中常见的两种穿插情况. 第一种比较常见的是角色与其他物体的穿插,比如手拿杯子脚踩地.这种情况的解决方法比较灵活,因为是两个物体,所以常常可以使用volume的那套方法找

Houdini中全景摄像机shader立体左右眼成像方法

熟悉Houdini Shader部分的同学应该多多少少也了解camera自身也可以设定自己的shader.其中polar panoramic shader 能够非常方便的为艺术家渲染360全景视角的cg画面,但是这样渲染出来的画面只是单眼所看到的环境,如果引入立体双摄像机的渲染方法的话,默认的这个摄像机shader就会出现一个严重的问题,那就是所渲染出来的画面是分别以各自两台摄像机位置为原点所计算出来的.用文字说明可能有点绕口,看下图: 图片中我把摄像头在一个水平轴向上移动了一点,渲染出来的结果

在C#中如何使用资源的方法

总结一个在C#中如何使用资源的方法:一:使用本地文件1.将本地要加入的资源文本(视频,图片,文本或其它)加入项目,比如我们现在加入一个up.bmp的图片到项目中,且放在文件夹Resources下面,2.将up.bmp的生成操作设置为"嵌入的资源"3.读取资源:Assembly assembly = Assembly.GetEntryAssembly(); //不知为什么,上面的有时候不行,可以这样写: Assembly assembly = this.GetType().Assembl

Office word 2013中直接调用MathType的方法

Office word 2013中直接调用MathType的方法 | 浏览:4403 | 更新:2014-02-20 14:45 | 标签: word 使用Office word 2013的用户肯定早已注意到在编辑文档时MathType无法直接调用,但是点击文档中的公式时能够跳出MathType的公式编辑窗口.其实,这一问题可以通过简单设置让 MathType 集成到Office Word 2013中. 工具/原料 Office word 2013软件.MathType软件 方法步骤 安装Mat

解决VNC中tab键无效的方法

http://ubuntuforums.org/archive/index.php/t-1771058.html I accidentally discovered a fix for this while trying to solve a different problem.edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xmlfind the line <property name="&l

Linux中的gpio口使用方法

Linux中的IO使用方法 应该是新版本内核才有的方法.请参考:./Documentation/gpio.txt文件 提供的API:驱动需要包含 #include <linux/gpio.h> 判断一个IO是否合法:int gpio_is_valid(int number); 设置GPIO的方向,如果是输出同时设置电平:/* set as input or output, returning 0 or negative errno */int gpio_direction_input(unsi

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法

七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT FIRST N * FROM TABLENAME 3. DB2数据库 SELECT * FROM (SELECT * ROW_NUMBER() OVER({ORDER BY COL1 DESC}) AS ROWNUM FROM TABLENAME) WHERE ROWNUM <= N 或者 SELEC