What & How & Why

Geometry Attributes

Houdini 中的几何属性相关知识点。


属性不是本地变量

必须要明确的是,Houdini 中的 AttributeVariable 是两回事。从 Programming 的角度来说, Attribute 更像是全局变量,存在于整个 cooking 的过程。而 Variable(Local Variable)则正如其名,本地变量。一般本地变量的生存周期应该与节点相关联,而如果将每一个节点看做一个函数,那么每一个 节点可以使用的本地变量也是不一样的。

属性与本地变量的区分

我们一般从下面的几个特点来区分属性与本地变量:

获取方式不同
  • 属性通过函数获取(比如 prim()point() 等等),新版本 Houdini 可以通过 @ 获取
  • 本地变量通过操作符 $ 获取
表现形式不同
  • 所有的本地变量都是大写(Uppercase)的。
  • 除非特别指定,属性一般都是小写的。
存在域不同
  • 属性存在于 cooked 的场景中
  • 本地变量的存在域为节点

关联属性和本地变量

属性和变量可以关联起来指向同一个数据。一般来说,属性和变量的关联有两种途径:

  1. Mapping:Attribute Create 使用了这种方法。如果不指定本地变量的名字,那么该节点将自动把属性名大写化,并作为本地变量的名字
  2. 手动创建:指定属性的名字。

Attributes

Houdini 中的属性(Attribute)是存取在点、线、面、对象等等中的值,比如点的颜色,点的位置,UV 坐标、Normal 等等就是作为 Point Attribute 来存储的。Houdini 中属性有几个特点:

  • Houdini 自身的节点带有一些属性,这些属性可以通过全局或者局部变量来进行调用(属性是不能直接调用的,需要转换成变量才能调用)。
  • Houdini 自身的节点属性有一些需要通过手动来设置,比如动力学解算器和渲染引擎的一些特定属性。
  • Houdini 允许自定义属性。

老版的 Houdini 中,属性名一般由小写字母组成。如果没有进行特殊命名,系统会自动将其转化为变量,变量名为同名的大写字母。这个过程称为 variable Mapping。在新版本的 Houdini 中,可以直接使用 @ + varible name + . + channel 的格式直接调用属性。

Geometry components

几何体的属性主要由 PointVertexPrimitiveDetail 属性组成:

  • Point 属性是以点为单位的
  • Vertex 属性是以顶点为单位的
  • Primitive 属性是以面为单位的
  • Detail 属性是以整个几何体为单位的。

几何体属性的优先级

需要注意的是,以上几种属性是有优先级的;也就是说,高等级的属性会覆盖掉低等级的属性Houdini 默认的优先级是:Vertex > Point > Primitive > Detail。属性的覆盖通常出现在 Merge 中,两个几何体 Merge, 若没有对应的属性则创建对应的属性,有对应的属性则按照上述优先级覆盖。

除开 Detail 的其他三个属性,都会在该几何体内部进行遍历(按点、顶点、面等等)。

几何体属性的编组

大部分的 SOP 节点都提供了使用属性进行 Group 的功能,比如 @P.y > 5 这样的表达式可以直接对组内的点进行筛选。我们可以使用 Houdini 提供的打组语法来进行分组Group syntax

我们同时还可以使用 Attribute Cast 节点对属性进行精度的控制(参考 Attribute Cast)。

Intrinsic attributes

geometrysheet 的列表中,如果点开 primitive 或者 detail 选项,会发现有上有一个 Intrinsics 的选项。



该列表下列出来的属性都被称为 Intrinsic attributes,也就是几何体固有存在的属性。这些属性是通过计算几何体得来的属性,比如下面的这些常见的属性:

Detail intrinsic:pointcount Number of points in the geometry
Detail/primitive intrinsic:bounds Bounding box of the geometry
Primitive intrinsic:measuredarea Surface area of the geometry
Primitive intrinsic:memoryusage Amount of memory used by the primitive

Intrinsic attributes Tips

查看 Intrinsic attributes
  • 命令行下 ginfo -I
  • geometry spreadsheet
  • Inspect tool
使用 Intrinsic attributes
Tools Usage
VEX intrinsic:xxxx 的形式直接读取,no @,use primintrinsic()detailintrinisc()
Python hou.Geometry.intrinsicNames()intrinsicValue().intrinsicValueDict()
Group @ + intrinsic:xxx + condition ,E.g.: @intrinsic:indexorder<100

不同精度的存储

存储属性有高精度 / 低精度 两种方式存储。

  • 可以在 Attribute Create 里指定存储的精度
  • 可以通过 Attribute Cast 控制存储的精度

常用的属性

注:

  • PTA = Points attribute
  • PRA = Primitive Attribute
  • DA = Detail Attribute

Geometry

Name Type What Where Tips
P vector Point Position Points PTA, 不唯一
N vector Normal direction
v vector Velocity Motion blur, particle Dop 可用 Trail 计算
id int unique element ID particle Dop 唯一, 和 P 这类的 element number 不同
name string primitive name packed primitives, volumes 可通过寻找 name 来选中几何体
piece int broken pieces Dop 独立碎块的编号,碎片的面共享该编号

Sizes / Rotations

Name Type What Where Tips
pscale float Uniform scaling factor Rendering 控制点和粒子的大小、instancing 的几何体大小
scale vector Axis scaling factor Rendering 在坐标轴方向上分别缩放
width float Open curve width Rendering PTA,调整渲染时曲线的宽度(世界坐标系下)
lod float Level of detail Instanting PRA, DA
spritescalevector sprint scaling factor sprint image PTA, Default(1,1,1)
spriterot float sprite rotation factor sprint image PTA, Default 0

参考资料