Houdini 中for-each 和for-loop 节点

学习houdini时间不长,刚入门的时候就一直对foreach的使用比较迷糊,在这里写一篇学习笔记来认识一下这个使用方式,比较基础 。如果有问题,请各位大佬及时补充和指正!


Houdini中关于循环的节点简介:

houdini中一共给了这6个框架:
1. for-each Number
2. for-each point
3. for-each primitive
4. for-each connected Piece
5. for-each Named Primitive
6. for-loop with Feedback

foreach2
foreach1
(在这里说明我用的是houdini 18之后的版本,如果版本太靠前应该foreach节点跟这个有所出入)

  • 这个框架它本身的作用就是实现for循环,如果不想用它的框架,也可以自己创建Block begin和Block end来搭建for循环。
  • 其中,for-each point,for-each primitive,for-each connected Piece和for-each Named Primitive的构造是相似的,使用的方法也是一样的,只是针对的元素不同(点,面,name属性)
  • connectivity是创造了一个class属性,根据class属性处理导入这个元素。
  • foreach2
  • 数据都是从Block Begin传入,我们中间可以任意添加节点来完成我们想要针对这个元素处理的操作,这个数据给每个元素循环处理后,最终由block end输出。end中可以选择Feedback Each Iteration来显示每一次结果,或者Merge Each Iteration来显示所有结果。

例子一:随机颜色:

  • 针对for-each point,for-each primitive,for-each connected Piece和for-each Named Primitive这四个框架可以做出此示例。
  • 循环迭代次数不是自动给出的,需要通过Block Begin中的“Create meta import Node来创建;它的detail上会有iteration的参数。若我们希望使用foreach,来达到进入循环的元素被进行的处理或者操作有所变化,那么我们也是通过iteration来实现的。

for-each point:

  • 使用vex做一个简单的颜色随机,注意iteration不要写错
    foreach_randCol_pt

for-each primitive:

  • 对于primitive也是完全一样的
    foreach_randCol_prim

for-each connected Piece:

  • 对于for-each connected Piece,则是根据它的class属性,处理它连续的元素。
  • foreach_randCol_class

for-each Named Primitive:

  • for-each Named Primitive也是根据name属性来处理元素(属性是在piece attribute上的,可以更改,但必须保持输入输出的是一致的,否则不能匹配)
  • foreach_randCol_name

for-each Number的用法:

  • 可以看出,它的Block Beginn中的method变成了“Fetch Input”,它的Block end中 Iteration Method变为了“By Count”。 他并不是对每个元素进行处理,而是对他本身进行拷贝,进入循环,它的迭代次数就是它的拷贝次数。
  • foreach_number
  • 由上示例,它每次的循环均为它的input,根据iteration的次数来做重复。

for-Loop的用法:

  • for-loop with Feedback中,它的默认Block Beginn中的method是“Fetch FeedBack”,它的Block end中 Iteration Method是“By Count”;它的Gather Method则默认是Feedback Each Iteration。如果for-each Number是指对本身的元素进行处理,那么for-loop with Feedback就是对循环整体进行处理。
  • 它是以上一个循环的end的结果作为下一次循环的起点,进行再次循环,一直循环操作我们在循环内设置的指令,直到迭代次数结束。
  • forLoop
  • 由上图示例,这个rubbertoy朝着x轴正向移动,每次移动单位为1米,循环了五次,移动到现在5米的位置。
  • 下图是merge each iteration,显示每次循环结果,可以更清晰看出。
  • forLoop_MergeEachIteration