【houdini笔记】学习houdini时整理的笔记

1 九月, 2014
243
2

Main-Image1

例1:使用粒子控制物体(text)的运动

1.本例主要是对表达式的理解。创建一个geo1,进入其中,然后拖入一个Font SOP,在text中键入自己需要的字体,本例我使用Houdini。再拖入一个PolyExtrude SOP给字体一个厚度。

2.接下来我们要做的就是给字体分组,使相应的粒子控制相应的字体。所以使用Connectivity SOP来打组连接的物体,将Connectivity Type该为Primitive,其它默认。然后使用Partition SOP将连接的物体放入到相应的组中,将Rule改为:yourName+$CLASS。

3.拖入一个Delete SOP来得到每个组中的中心点,将Operation改为Delete Non-Selected。其它保持默认,再拖入一个Group Geometry SOP命名为allpoints,将Entry该为Points。然后再拖入一个Add SOP来创建一个点,为了使创建的点的数目和物体组的数目相同,接下来要用到Copy SOP。

4.在Add SOP后拖入一个Copy SOP,在Number of Copies中写入表达式:argc(primgrouplist(“../facet1″)),使用该表达式可以得到组的数目,其中primgrouplist是列出组,而argc是得到组的数目。然后勾选Stamp Inputs,创建一个变量名ncy,值为$CY。

5.在步骤3中,我们创建了一个Delete SOP,接下来我们要在它的Group中写入如下表达式:`arg(primgrouplist(“../facet1″),stamp(“../copy1″,”ncy”,0))`,即得到单个的组。然后我们在步骤4中,即add1后拖入一个Delete SOP,删除组allpoints。这样就得到了单个的点,而这个点正是add1添加的。接着我们修改点的位置,使其在相应物体组的中心,在add1的Point0中分别键入$CEX, $CEY, $CEZ。这样我们得到了相应的单个的点,而且都在相应物体的中心上。

6.接下来我们所做的就是要得到相应的单个物体。在facet1的输出中按鼠标中键,拖入一个Delete SOP,将Operation改为Delete Non-Selected。然后再在其后拖入一个Copy SOP,勾选Stamp Inputs,创建一个变量名ncy,值为$PT。连接Input1到delete2即刚才创建的节点,Input2到copy1。再在delete2的Group中写入表达式:`arg(primgrouplist(“../facet1″),stamp(“../copy2″,”ncy”,0))`。接下来你只需要在copy1中插入粒子系统,就可以完成粒子控制物体了。见样例:particle_control_geoemtry.hip。

例2:随机选择多个物体,并从旋转前的图片变换到旋转后的图片: 下图分别为变换前后

houdinixuexi1-1 1.首先我们来构造单个物体,在/obj层次上拖入一个geometry,进入到geo1(默认)中,创建一个Circle SOP,并命名为single_brick,然后将Primitive Type该为Polygon,Orientation改为ZX plane,Divisions改为3(即等边三角形)。接下来我们将要修改single_brick的半径。

2.创建一个Grid SOP,命名为wall,Orientation改为XY plane,Rows为11,然后Columns参考Rows的通道(即ch(“rows”))。接下来我们将借助wall中的单个面的大小来决定single_brick中的半径大小。 而wall中单个面的边大小为:ch(“../wall/sizex”)/(ch(“../wall/rows”)-1),这样由上图的公式可得single_brick的半径大小为:(ch(“../wall/sizex”)/(ch(“../wall/rows”)-1))/(2*cos(30))。
houdinixuexi1-2 3.在single_brick下拖入一个Copy SOP,Number of copies改为2,在Translate的ty中键入:ch (“../wall/sizex”) / (ch (“../wall/rows”)-1),即为wall中单个面的边长。

4.在copy1下拖入一个Skin SOP,勾选Keep Primitives。然后再拖入一个Fuse SOP,命名为brick。再在其后拖入一个AttribCreate SOP,命名为prnum,在Name中键入$OS,Class为Primitive,Value中的value1为$PR。为什么要创建这个属性呢?因为这在进行UV坐标转换的时候发挥了作用(即根据面的数值来打组)。

5.好,接下来我们来给wall进行一系列操作。首先在wall后拖入一个Facet SOP,勾选Unique Points,然后拖入一个AttribCreate SOP,命名为center_point,在Name中键入centerpt,Class为Primitive,Size为3,Value分别为$CEX, $CEY, $CEZ。这样给每个面添加了一个中心点位置的属性。接着我们再在其后拖入一个Point SOP,将Position分别改为:$CENTERPT1, $CENTERPT2, $CENTER3。即将相应面的所有点放到相应面的中心上。最后拖入一个Fuse SOP, 勾掉Remove Degenerate,来合并点。这样将相应的单个点放到了相应面的中心上。为了得到随机的点,在其后拖入一个Sort SOP,将Point Sort改为Random,然后再在其后拖入一个AttribCreate SOP,命名为ptnum,在Name中键入$OS,Value中的value1为$PT。这个点属性在控制物体随机旋转时发挥作用。

6.拖入一个Copy SOP,命名到copy_to_grid,将brick连入到Input1,ptnum连入到Input2。转换到Stamp栏,勾选Stamp Inputs,在Variable1中键入rot,Value1中键入rand($PT*360)。这将会在随后加入的Transform SOP中来控制single_brick的随机旋转,使复制的brick不是以一种统一的方式摆放。

7.首先我们来创建一个Null SOP,命名为master_controller,来达到一种控制全局参数的目的。然后再在其中添加控制参数,添加一个float类型的参数,Label命名为Rand Rotate Rate,Parm命名为rate,锁定值范围为0到1,默认值为0.36。

8.在brick后拖入一个Group Geometry SOP,命名为rand_rotate,在Group Name中键入$OS,将Operation改为Group by Expression,然后在下面键入if(stamp(“../copy2″,”rot”,0)>=ch(“../master_controller/rate”),1,0),来打组满足条件的物体。

9.在rand_rotate后拖入一个Transform SOP,在Translate的ty和tz中分别键入:-ch(“py”)和ch(“../single_brick/radx”)/2,Rotate的ry为30,rz中键入(控制复制物体的随机旋转):if(stamp(“../copy2″,”rot”,0)>=ch(“../master_controller/rate”),90,0),Pivot的py中键入:bbox(“../brick”,D_YSIZE)/2。Py中键入的表达式是将物体的y轴放到brick的中心上。而tz中的表达式是将面对其到YX平面。

10.拖入一个Delete SOP,命名为delete_rand_rotate_group,Group为rand_rotate。然后再拖入一个Connectivity SOP,将Connectivity Type该为Primitive。再在其后拖入一个Foreach SOP (用来得到单个物体的中心点),命名为get_each_center_pivot,将For该为Each Attribute Value,Attribute为class。这样通过属性class来分离物体。

11.进入get_each_center_pivot,在each1下拖入一个AttribCreate SOP,命名为centerY,在Name中键入centery,Value的value1中键入$CEY。然后再拖入一个Delete SOP,将Operation Type该为Delete Non-Selected,Entity为Points,Pattern为0,即保留点0。

12.创建Point SOP (用来放置点0到单个物体的中心上),在Position的tx, ty 和tz中分别键入:(point(“../each1″,0,”P”,0)+point(“../each1″,1,”P”,0)+point(“../each1″,2,”P”,0))/3, $CENTERY,(point(“../each1″,0,”P”,2)+point(“../each1″,1,”P”,2)+point(“../each1″,2,”P”,2))/3

13.然后再在其后创建一个AttribCreate SOP用来存储单个物体的中心位置,命名为center, Name为newcenter,Type该为Vector,在Value中分别键入:point(“../point1″,0,”P”,0), point(“../point1″,0,”P”,1), point(“../point1″,0,”P”,2)。

14.拖入一个AttribTransfer SOP,连接each1到它的Input1,center到它的Input2,然后勾选Points,并选择属性newcenter。这样每个brick的点都有了属性newcenter。
接下来我们要给物体展UV,在get_each_center_pivot后拖入一个UV Project SOP,将Group Type该为Vertices,为什么要改为Vertices而不是Points呢?这是因为在单个的brick中,每个面的点有独立的UV信息,而Points会使每个面和其它的面共享UV信息。

houdinixuexi1-3 16.拖入一个Foreach SOP,命名为uv_transfer,For为Each Attribute Value,Attribute为class。进入到uv_transfer中,接下来我们要做的就是转换brick的uv信息。在each1后拖入一个Attribute SOP,命名为delete_centery_attr,在Delete Attributes中键入newcenter。在其后拖入一个Group Geometry SOP,命名为sideGrp,Operation为Group by Expression,在Filter Expression中键入$PTNUM == 4,这样我们得到侧面,即上图中的面4。再拖入一个Group Geometry SOP,命名为frontGrp,Operation为Group by Expression,在Filter Expression中键入$PTNUM == 2,这样我们得到侧面,即上图中的面2。(注意记得在两个组的Group Name中键入$OS,后面创建的这个组也是一样的)。然后我们再打组其余的面,拖入一个Group Geometry SOP,命名为restGrp,转换到Combine下,在Group下分别选择$OS和frontGrp,符合为不等号,然后再在下面选择Intersect (And),符合也是不等号,然后键入sideGrp,这样就将其余的面放到了组restGrp里面。

17.接下来我们要分离出面,在restGrp后拖入一个Delete SOP,命名为keep_front,在Group中选择frontGrp,Operation为Delete Non-Selected,然后按中键创建另外一个Delete Sop,命名为keep_side,在Group中选择sideGrp,Operation为Delete Non-Selected,然后按中键再创建另外一个Delete Sop,命名为keep_rest,在Group中选择restGrp,Operation为Delete Non-Selected。由于我们的随机旋转只是在侧面和正面,因此我们要将正面的UV信息复制给侧面的面,那怎样去做呢?这时我们用到Point SOP。

18.首先给组sideGrp和frontGrp中的点分类,因此分别拖入一个Sort SOP,命名为front_sort和side_sort,Point Sort都为By vertex order。然后再拖入一个Point SOP,将front_sort连接到Input1,side_sort连接到Input2,然后再Position中分别键入$TX2, $TY2, $TZ2。这样我们就将正面的UV信息复制给了侧面(注意这时的侧面实际上还是正面,我们只是将正面移到了侧面的位置,因此接下来非常重要的一步就是重新给侧面打组),在其后拖入一个Group Geometry SOP,命名为newSideGrp,转换到Combine下,在Group中分别键入sideGrp和frontSide,符号为等于号,这样才完全完成了UV的转换。然后再拖入一个Merge SOP,连接front_sort, newSideGrp, restGrp到merge1上,最后再在其后拖入一个Fuse SOP。拖入一个AttribTransfer SOP,将fuse1连接到它的Input1,each1连接到它的Input2,勾选Points,并选择newcenter。

19.接下来我们要完成非常重要的一步,那就是完成brick的随机旋转。首先我们回到master_controller节点,并添加两个全局控制参数,它们分别是speed和delay。再拖入一个AttribCreate SOP,在Name中键入rotation,Class为Primitive,Value的value1为:clamp($T*ch(“../master_controller/speed”)-$PTNUM*ch(“../master_controller/delay”),0,120)。

20.拖入一个Primitive SOP,勾选Do Transformation,在Rotation的ry中键入$ROTATION,在Pivot中分别键入$NEWCENTERX, $NEWCENTERY, $NEWCENTERZ。

21.接着我们选中delete_rand_rotate_group到primitive1之间的所有节点,然后复制,并粘贴。将delete_rand_rotate_group1重命名为keep_rand_rotate_group,将attribute2的属性名Name改为rotation1,将primitive2的Rotation的rx改为-$ROTATION1,并删除ry的通道。

22.拖入一个Merge SOP,将primitive1和primitive2连接到merge1。然后再在其后拖入一个UVQuickShade,Group为frontGrp。接着在拖入一个UVQuickShade,Group为sideGrp,最后在拖入一个Facet SOP,这样就完成了制作。你可以再Texture Map中插入自己喜欢的图片,而不是默认的。见文件rand_rotate_brick_demo.hip。