Houdini

「Houdini」常更帖——关于H中一些常用节点/函数的记录

by Ayse, 2022-02-20


0.png


VEX

固定参数

@elemnum 代表组件的序号,@numelem 代表组件的总数。除此之外,在Primitives环境下,@primnum代表Primitive的序号,@numprim代表Primitive的总数。在Points环境下,@ptnum代表Point的序号,@numpt代表Point的总数。在Vertices环境下,@vtxnum代表Vertex的线性序号,@numvtx代表Vertex的总数。@代表某种固定参数,bbox选择可以用XSIZE代替相减

常用函数

  • relbbox relbbox(0,pos)就是求pos在#0输入端输入的模型中的相对位置,整一个模型会被归一化到111
  • prim&point primpoints()得到一个面的所有点,prim是primitive的称呼,@primnum就是面的数量,pointprims()得到一个点对应的面序号,npointsgroup 得到点的数量,nprimitives面的数量,prim(0,“参数”,primnumber)直接读prim里面的参数。setprimattrib()可以定向设定一个的参数
  • intersect intersect(输入端口,点,向量,pw相交点位置,uvw相交点的uv位置)射线检测,碰到返回负一
  • detail 在VEX中需要用//来包括住

算法系列记录

  • 点云找点
    • pcopen获取数据输入端的属性,保存在handle里;int handle = pcopen(1,'P',@P,2,2);//1号输入端的位置属性被0号输入端的@P以半径2查找两个点,查找的是1号点的。
      pciterate主要是判断handle里是否有内容(0和1),有的话才会运行,一般用于while的条件。 pcimport的主要功能是从handle里提取找到的点的数据,需要定义新的变量来储存,比如用变量color来存储@Cd属性,写成pcimport(handle,'Cd',color);
      pcnumfound()找pcloudhandle的数量
    • 如果用sop则可以直接fuse节点然后输出一个fusegroup就可以,但不方便在vex中处理。同样功能的还有pcfind,nearpoints等等,使用可以查文档。neighbours是计算同一条边上相接的点,相邻顶点,可以用来求断开的边缘等

SOP

备注记录

  • Group group里面的输入可以直接是序号,同时,如果用函数要写·来包裹,其他情况比如是string的表达可以直接写,比如@type==roof。注意!!group里面不能有空格,空格代表的是另外一个元素

    • 对组对操作方法:@group_name方法,等于1是建组,等于0是移除出去,当然也可以用group相关的几个VEX实现,不过比较麻烦,比如我们对顶点的y值大于0的点打组到了up组,移除出了up组

      if (@P.y > 0) {@group_up = 1;}

  • 提取轮廓线/边缘的方法 1.png

    • 先用group选出来特定的edge,这个时候是不可以直接blast的,edge是和prim关联在一起的,所以需要用convertline或者primitiveattrib节点把这些转化为线(后者使用见图) 然后groupcopy把刚刚的edge拷贝到线上(convertline会把edge信息抹除,prim节点不会但是不知道为什么最后会少两条线),然后就用dissolve2.png
    • 把其他线溶解掉(如果用blast断线会给你连起来)并转乘polygon然后就可以啦 3.png
  • Module placement

    • 全新的添加模型技巧,称之为,place module,一共只包括了几个节点,主要的难度在于命名。这个subnet里面包含了一个循环分别把点的信息读出来然后复制上去。4.png
    • file的路径可以用 ` 装函数表达和普通字符区分开。

    $HIP/module/points("../locate", 0, "folder")/points("../locate", 0, "type")points("../locate", 0, "name")`points("../locate", 0, "variation")

      • 我们只需要在外边添加一个wrangle把需要的路径信息补充填到内容上就ok了。variation甚至可以带来同一个name不同效果的系列体验。代码如下

    s@folder = "body"; s@type = "body"; s@name = "door_plane"; if (rand(@ptnum)>0.6) s@variation = "03"; if (rand(@ptnum)<0.3) s@variation = "02"; if (rand(@ptnum)>0.3 && rand(@ptnum)< 0.6 ) s@variation = "01";


常用节点

  • copy stamps 见文章Houdini中的旋转
  • rest 可以保存参数,normal position之类,后面再用同样extract 提取
  • bound 之前撒点划分(内部也撒到的)操作可以用这个代替,当然,直接把一堆东西连到一个box然后选择polygon也可以直接分

作者: Ayse

2024 © typecho & elise