当前位置: 首页 > news >正文

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速度来估计其它值是怎样转移的,但毕竟帧与帧之间我们只能以线性匀速来估计,但是解算的时候速度肯定不是线性的而且大部分时间也不是均匀的。

转载于:https://www.cnblogs.com/simonxia/p/4331187.html

相关文章:

  • 添加树莓派python程序自启动的方法
  • 开源Math.NET基础数学类库使用(01)综合介绍
  • webapi返回json字符串
  • Hash小结
  • css 清除浮动样式
  • linux shadow破解
  • 大学生如何看待校园考勤
  • Android中ListView结合CheckBox判断选中项
  • 常用Linux命令
  • ETCD 安装及使用
  • Server.MapPath和Request.PhysicalApplicationPath的异同
  • 滴滴 Elasticsearch 多集群架构实践
  • php实现猴子选大王
  • 报错:exec:gcc executable file not found in %PATH%
  • 趣味集算:数独
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • CSS居中完全指南——构建CSS居中决策树
  • Docker容器管理
  • MySQL用户中的%到底包不包括localhost?
  • PHP变量
  • 猴子数据域名防封接口降低小说被封的风险
  • 判断客户端类型,Android,iOS,PC
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 算法之不定期更新(一)(2018-04-12)
  • 小试R空间处理新库sf
  • 一文看透浏览器架构
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $ git push -u origin master 推送到远程库出错
  • (4) PIVOT 和 UPIVOT 的使用
  • (5)STL算法之复制
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Forward) Music Player: From UI Proposal to Code
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net 8.0 新的变化
  • .NET 反射的使用
  • .Net 路由处理厉害了
  • .NET 依赖注入和配置系统
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net和php怎么连接,php和apache之间如何连接
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @html.ActionLink的几种参数格式
  • [Android Pro] AndroidX重构和映射
  • [Android学习笔记]ScrollView的使用