【微答】houdini16中foreach全讲解(11讲)从一个案例引发的研究
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
昨天在CG猎人vip群上,有位同学在看一个小案例教程时候遇到一个疑问,涉及到houdini新版本的foreach中的一个特殊用法。小编也研究了一下,解答了这位同学的问题。顺便把foreach都理一遍,相信很多初学者对新版的foreach都不太熟悉,这里小编也整理出来,方便大家学习。
教程案例的目的 要创建等间距的同心圆
最容易想到的方法就是使用copy transform节点进行缩放复制
但是无论如何调整,都不会等间距缩放
原因很简单,因为等价缩放0.8,基础圆越大,缩放绝对值越大,到后面上一个圆越小,缩放绝对值越小;最后的结果就是这种间距越来越小的的同心圆。
教程中提供的方法是使用blendshape节点实现,和一混合两个相同拓扑结构的模型0-1的变化,只要在0-1之间进行等分,那么他们的之间的距离是保持不变的。比如等分10个,那么需要分别输入0.1,0.2,0.3.......0.9这样就可以获得多个同心圆。
我们可以手动链接10个blendshape,分别调至上面的值,但是这样做太麻烦。所以就引入到我们今天要说的foreach循环。
教程中的链接方法如下,这是那位同学的疑问:这个foreach begin节点为什么不用链接进去?
其实这个问题也就带出来后面的另外一种连接方法
这两种链接方法是完全一模一样的(当然,教程中的foreach还算是刚更新的版本,还没有这个选项)
下面我们就来讲解一下foreach的实现方法
block begin这个4个模式
Fetch Feedback 提取反馈
Fetch Piece or point 提取块/面/点
fetch Metadata 提取数据
Fetch input 提取输入(后面更新的选项)
当我们创建foreach的时候,实际上是创建了节点块,有begin和end,大家很自然的会想到在之间连接需要的节点进行循环制作。但是实际上需要考虑的内容更多
1如何对待输入物体
2循环的模式
3输出结果的模式
上面三点其实是解决了3个问题
1循环的基础点:是基于最初始化模型做循环?还是基于上一次循环的结果做循环?
2循环的次数:是人为控制数量还是基于输入端中的模型数量?
3输出结果:是输出最后循环的结果还是输出每次循环的合并后的结果?
block end
interation method插值方法虽然有3个选项,实际上就是两个
Auto detect from inputs(这个是基于begin中的input选择)
by pieces or point基于块/面/点的数量进行循环
by count 人为设置循环数量
Gether method输出结果:merge each iteration把每次循环迭代合并输出;feedback each iteration输出每次的迭代结果
piece attribute 基于某个属性来对输入模型分块;
第一 大部分情况下默认链接foreach会初选警报图标
这是因为默认情况下 piece attribute是开启的,那么需要输入模型带有name这个属性,如果没有,foreach就会出现报错。这种情况下把piece attribute关闭就可以。后面我们再来讨论这个name的属性的作用。
第二fetch input选项
这个就是同心圆的案例的选项,这个也等价于直接不连接foreach begin而连接到circle是一样的。这也说明,fetch input每次循环都是以最开始的circle(输入模型做基础)进行循环控制的。blendshape中我们每次混合变化都是以最初的cirle和最终的cirlce进行混合,只是调整权重值不一样而已。
第三fetch feedback
我们把选项修改为fetch feeback,那么就会出现copy节点那种变化的同心圆
这个的原理就是每次循环的处理都是基于上次一循环处理的结果,也就是说输入端不再是最开始的初始化模型,而是从foreach end中再次返回到foreach begin之中,就会出现由于基础不一样导致的缩放绝对值不一样的结果。
第四 fetch pieces or points
这个是对于输入多物体或者多点物体/面物体的选项,可以配合name的使用。
原理就是你是基于模型的上的点/面/分组进行循环(name),也是最常用方法
当在begin节点中选择了fetch pieces or points选项的时候
在end节点中就需要做判定
iteration 迭代方法就不能使用by count,因为这个是由输入的物体元素数量来决定迭代次数
piece elements 元素可以选择
1points元素
2primitive面元素
3激活piece attribute,基于name元素
比如刚才的同心圆案例,选在point元素就是得到这个螺旋效果,因为每个点进行偏移迭代,从第一个点到最后一个点,越来越靠近中心圆。
如果选择的是primitive元素,那么会报错,因为我只有一个cirlce primitive,不能构成循环迭代;
但是如果我输入的是一个box或者细分的grid,那么就可以直接选择primitive
第五 name的作用
我们知道了可以对点和面进行单独循环,但是如果我想对自己分组进行循环呢?比如我不想对每个面进行循环,而是给面分一些组,然后对这些组在进行循环,这时候就是这个name的作用了。我们可以对面分组,设置不同的name的值;
给面生成一个name属性,让他们随机分组,这样得到了一个迷宫一样的挤出,而不是之前的单独面挤出的效果。
当然,如果学过bullet破碎同学对name就非常熟悉了,对于不同的碎块设置不同的name,这样bullet和自动基于name进行识别。
第六 fetch metadata 获得数据
当我们切换成fetch metadata时候,不会有任何输出结果;选择begin节点,打属性面板,在detail中会看到下面属性
而这就是迭代过程中一些变量
iteration 为当前迭代次数
numiterations为总共迭代次数
所以这时候foreach begin的作用就不再是输出迭代结果,而是用来提取迭代中的数值。我们可以基于这两个变量让每次迭代效果都不一样,生成规律或者随机的效果;
第七 create meta import node选项
我们了解了第六点,这是就生成了一难题,也就是当我想获得数据的时候就不能获得结果,解决办法很简单,把foreach_begin复制一个出来,一个用fetch meatadata获得数据,另外一个基于我们需要获得结果,这样就满足我们需要了。
当然,houdini为了方便我们操作,直接在begin节点中多了create meta import node选项,直接点击,实际上也就是多创建了一个begin节点,只是选项自动切换为fetch metadata。顺便说一下,你可以创建多个这种fetch metadata选型的节点。
第八 如何调用metadata数据
上面我们知道数据存储在metadata节点的detail层级上,所以直接使用detail()函数进行访问
detail("../foreach_begin1_metadata1","iteration",0) 访问当前迭代次数 iteration
detail("../foreach_begin1_metadata1","numiterations",0) 访问迭代总次数numiterations
detail("节点路径",“变量名”,变量中的元素序号)
同心圆案例中使用表达式如下
第九输出结果
在foreach end节点中
feedback each iteration可以通过选择iterations输出自己想要的中间结果,比如这里是第三次的值
merge each iteration
可以合并所以所以迭代结果进行输出。
第十 限制迭代次数
我们知道,选择bycount方式可以人工设置迭代次数,但是对于by piece等如果输入模型过多,可能会导致迭代次数过多而造成电脑死机。这时候就可以激活 max iteration进行总数限制,避免循环过多电脑跑不起
第十一,快速预览某个次迭代结果
如果我们选择by count的方法,我们可以使用gather method配合iterations进行单独输出某次迭代效果,但是如果我们选着的by pieces的,iterations就不起作用了(因为是由pieces数量决定迭代次数)
激活single pass,可以只单独输出选择的某次循环记性查看,对于快速预览和调整非常有用。
好了,这就是昨天晚上从一个小案例中的问题引出来的对foreach的全面讲解内容,希望对大家有所帮助。如果想加入CG猎人资源vip群的同学请戳下面链接,查看加群的具体方法~
CG猎人(Hunter_CG)专注于CG微资讯与微课程的分享(10分钟以内)。让广大CG爱好者与从业人员能够利用零散时间了解最新最具前景的资讯,了解国际技术发展动向与前沿市场动向。提供精挑细选实用微课程,从入门到高级循序渐进。通过知识总结与分享,共同进步。
分享教程和学习笔记,同时设计maya,3dsmax,softimage,houdini,cinema4D blender,modo和lightwave等常用三维软件,也包含reallow,naaid专门制作特效的三维软件;包含fumefx,rayfire,karakato和thinkingparticles等插件教程和学习笔记。
—— CG猎人——
微信号:Hunter_CG
QQ-540710114
为您提供最具前景的资讯与最适合的分类技术与学习教程