首发于Go Procedural
Houdini:数据的引用和传递

Houdini:数据的引用和传递

我们知道Houdini的工作区里布满了各种网络,数据在这些网络里传递流动。这些网络的构成,有输入,有输出,有参数面板等,下面我们来一个一个认识他们。

Networks

Network,也就是网络,就是你在Houdini中看到的各种连线组成的东西所在的地方。Houdini有一个面板,叫做Network View,当我们打开Houdini的时候,默认布局右下角部分的一大块就是,这个地方基本上什么都可以放,是我们工作的主要区域之一。

Objects Network

Objects Network

首先说这个最常用的Objects Network,他存放了所有场景里的实物。包括建的模型、搭的光照,架的摄像机,当然也可以存一些子网络,不过这里暂且不细说。

我们在这里建立三个Box,修改一下坐标让他们分开,然后连成下面的样子:

这个时候,我们在左边的Scene View里移动box1,发现box2和box3也跟着一起移动了。这是因为在Objects Network下,节点之间的连线,不代表数据处理关系,而代表父子层级关系。所以骨骼关系也是这样处理的:

Geometry Network

这也是我们最常见的网络之一了,新建一个Geometry,选中按i或者双击就能进去,我们在这里新建一个Box:

我们发现这也有一个可以连的点,然而和上面不同,这里是一个输入节点Bounding Source,从这里输入的几何体的Bounding Box将会作为这个节点生成的Box的尺寸。举个例子,我在这里连一个Rubber Toy,这个节点就会生成一个Rubber Toy的Bounding Box。

这样的节点连接,很像软件工程里的数据流程图,描述了数据从哪来,经过了什么操作,最终到哪里去。

简单的说一下这个节点操作,鼠标放上去就能悬停点击。

  • input,可能有零个、一个或多个,这个是输入,不同的操作可能有不同的要求。
  • output,可能有零个、一个或多个,这个是输出节点,处理过的数据可以从这里传给下一个操作。
  • Display/Render点击将会以这个节点作为整个几何体的最终结果,代表这个结果在视窗显示或最终用于渲染,默认同时选中,可以分开设置,中间的紫色实心圆代表渲染,蓝色空心圆代表显示。
  • Template/Selectable Template,点击会将这个节点以线框的形式作为参考模型,默认参考模型是不可选中的,使用快捷键可以把它设置为可选中。
  • Bypass,点击将会使网络绕过此节点,效果等同于此节点的输入和输出直接连起来,若有多个则会连接到第一个,将节点临时无效化常用于调试,或者对比效果。
  • Node Info,点击可以查看常用节点信息,可以快速查看属性是否正常。
  • Lock,点击可以冻结这个节点的当前输入结果,相当于存了一份前面的数据,这个时候修改前面的节点不会影响到这个节点的输出,但是当解冻的时候,会瞬间应用之前改过的变化。

其它Network

既然我们可以通过在Objects Network中创建Geometry来构建Geometry Network,那肯定还有别的类型的Network,新建搜索Network。

他们分别用来组织不同的节点类型。

  • CHOP Network, 用来组织Channel相关的节点,Channel的概念下面会说。
  • Constraints Network,用来组织几何体的刚体约束。
  • COP2 Network,用来处理2D图片或者2D形式的数据(例如深度图),常配合渲染器使用,类似程序化版Photoshop。
  • DOP Network,用来描述动态模拟的数据,例如刚体,软体、流体等。
  • Material Network,用来存材质的网络,在Material Palette中创建的材质可以在这里看到并修改逻辑。
  • ROP Network,存放渲染相关的节点。
  • SHOP Network,老版本(<16)的构建shader的网络,已经被官方声明废弃。
  • TOP Network,构建任务流程的网络,也就是创建PDG的地方。
  • VOP Network,通过使用VEX操作符构建各种类型的节点的地方,包括shader节点。

这些类型分别会在相应的文章中细说。

点击这里我们可以看到,除了/obj,Houdini为我们创建了几个默认的其他类型的网络。

Paths

上面提到/obj是默认的Objects Network,这里的“/obj”,就是一个路径。和我们熟知的文件系统一样,网络节点的引用也是以路径的形式表示的。点击路径栏的下拉列表可以查看并快速跳转到其他网络。

Subnetwork

除了上面的不同类型的Network,在任意网络下可以创建子网络,创建的子网络类型和当前的网络类型相同。常用于整理一组功能,复用等。

默认一个Subnet是4个输入一个输出,在变成HDA后最多有10个输入10个输出(但是不推荐太多输入输出节点,毕竟你平时写代码的时候,函数参数一般也不会写十来个吧)。

单纯的Subnet节点(非HDA)的输入个数不能增加,只有4个,但是可以在里面通过Object Merge引用更多的节点(通过path)。

单纯的Subnet节点可以增加输出,方法是使用Output节点,但是要注意Output Index取值范围为[0-9],超过则无法引出。如果没有对应下标的output节点,默认会取Display/Render Flag作为其输出。

在当前网络下创建不同类型的网络作为子节点也是可以的,目的是把一套完整流程的不同操作类型存在一个节点里,常用于制作HDA。

Parameters

参数是节点的属性,也是我们在做操作的数据源头。默认情况下,参数面板在整个界面的右上角。也可以直接在网络面板内,对选中的节点按P键显示。

参数的类型和表现形式

绝大多数参数是一些基本类型,或由基本参数组合成,部分参数有着特殊的展现形式,但是它的值仍是基本类型。下面是常见的参数类型和表现形式:

参数的填写

绝大多数的参数可以直接填写,部分参数需要操作,比如点击,选择,切换等。

表达式

可以是任意的数值表达式,例如1+1,也可以调用函数,例如sin($T)。

引用

通过复制粘贴的菜单,或者直接拖拽参数,就可以直接引用参数。

为了保证可复用性,一般我们选择相对引用Relative Reference。

比如上图这样,我们就创建了一个XYZ方向尺寸相同,并且与水平面上方相切的立方体。注意图中的参数背景颜色,深绿色表示直接的引用数据,亮绿色表示表达式。然后我们拖动时间轴:

颜色变蓝色了,其实蓝色表示现在是非关键帧的值,绿色表示关键帧的值。我们拖动了时间轴后可以修改值,并加入关键帧,这样参数就可以在这之间插值了。

Channel

上面我们引用数据使用了ch函数,其实是表示读取Channel的意思,字符串里的内容就是Channel的Path。比如这个size有xyz三个通道。每一个这样参数分通道,叫做Channel。Shift+鼠标左键点击参数通道,可以打开动画编辑器,也就是时间轴编辑器,可以在里面方便的K帧,调整插值方法。

用表达式引用数据

HScript,具体含义可查文档。

  • ch("path")
  • chf("path", frame_num)
  • cht("path", seconds)
  • chs("path")
  • chsraw("path")
  • chsop("path")
  • chramp(ramp_path, position, component_index)
  • chrampf(ramp_path, position, component_index, frame)
  • chrampt(ramp_path, position, component_index, time)

VEX和Python也有对应的方法。

自定义参数的构建

除了节点自带的参数,我么也可以自己定义参数,常用于制作HDA。

打开后我们就可以构建自己的参数了。

可以从左边的类型拖到中间构建参数,在右边可以修改参数的属性。快速熟悉构建参数最好的方法是学习自带节点的参数属性。

另外,Attribute Wrangle,中写的代码可以自动推断你要创建的参数,点击按钮可以自动创建自定义参数。

如果参数表现类型想更换,可以再编辑下,比如color参数默认建立成Vector,可以改成Color。

更多文章

通过Houdini迈向程序化(目录)

编辑于 2019-09-02 10:48