======Geometry Attributes======
Houdini 中的几何属性相关知识点。\\
----
====属性不是本地变量====
必须要明确的是,Houdini 中的 //Attribute// 和 //Variable// 是两回事。从 Programming 的角度来说, //Attribute// 更像是全局变量,存在于整个 cooking 的过程。而 //Variable//(Local Variable)则正如其名,本地变量。一般本地变量的生存周期应该与节点相关联,而如果将每一个节点看做一个函数,那么每一个 节点可以使用的本地变量也是不一样的。
\\
\\
===属性与本地变量的区分===
我们一般从下面的几个特点来区分属性与本地变量:
==获取方式不同==
* 属性通过函数获取(比如 ''prim()''、''point()'' 等等),新版本 Houdini 可以通过 ''@'' 获取
* 本地变量通过操作符 ''$'' 获取
==表现形式不同==
* 所有的本地变量都是**大写**(Uppercase)的。
* 除非特别指定,属性一般都是**小写**的。
==存在域不同==
* 属性存在于 //cooked// 的场景中
* 本地变量的存在域为**节点**
===关联属性和本地变量===
属性和变量可以关联起来指向同一个数据。一般来说,属性和变量的关联有两种途径:
- Mapping:''Attribute Create'' 使用了这种方法。如果不指定本地变量的名字,那么该节点将自动把属性名**大写化**,并作为本地变量的名字
- 手动创建:指定属性的名字。
====Attributes====
//Houdini// 中的属性(//Attribute//)是存取在点、线、面、对象等等中的值,比如点的颜色,点的位置,//UV// 坐标、//Normal// 等等就是作为 //Point Attribute// 来存储的。//Houdini// 中属性有几个特点:
* //Houdini// 自身的节点带有一些属性,这些属性可以通过**全局或者局部变量**来进行调用(属性是不能直接调用的,需要转换成变量才能调用)。
* //Houdini// 自身的节点属性有一些需要通过手动来设置,比如动力学解算器和渲染引擎的一些特定属性。
* //Houdini// 允许自定义属性。
老版的 Houdini 中,属性名一般由小写字母组成。如果没有进行特殊命名,系统会自动将其转化为变量,变量名为同名的大写字母。这个过程称为 variable Mapping。在新版本的 Houdini 中,可以直接使用 @ + varible name + . + channel 的格式直接调用属性。
====Geometry components====
几何体的属性主要由 //Point//、//Vertex//、//Primitive// 和 //Detail// 属性组成:
* //Point// 属性是以点为单位的
* //Vertex// 属性是以顶点为单位的
* //Primitive// 属性是以面为单位的
* //Detail// 属性是以整个几何体为单位的。
===几何体属性的优先级===
需要注意的是,以上几种属性是有**优先级**的;也就是说,**高等级的属性会覆盖掉低等级的属性**。//Houdini// 默认的优先级是://Vertex// > //Point// > //Primitive// > //Detail//。属性的覆盖通常出现在 Merge 中,两个几何体 Merge, 若没有对应的属性则创建对应的属性,有对应的属性则按照上述优先级覆盖。
\\
\\
除开 //Detail// 的其他三个属性,都会在该几何体内部进行遍历(按点、顶点、面等等)。
\\
\\
===几何体属性的编组===
大部分的 //SOP// 节点都提供了使用属性进行 //Group// 的功能,比如 ''@P.y > 5'' 这样的表达式可以直接对组内的点进行筛选。我们可以使用 //Houdini// 提供的打组语法来进行分组[[http://www.sidefx.com/docs/houdini/model/groups#manual|Group syntax]]。
\\
\\
我们同时还可以使用 ''Attribute Cast'' 节点对属性进行精度的控制(参考 [[vfx:houdini:sop:node:attribute:attr_cast|Attribute Cast]])。
====Intrinsic attributes====
在 ''geometrysheet'' 的列表中,如果点开 ''primitive'' 或者 ''detail'' 选项,会发现有上有一个 ''Intrinsics'' 的选项。
\\
\\
{{ :vfx:houdini:concepts:geo:intrinsics-min.png?600 |}}
\\
\\
该列表下列出来的属性都被称为 //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 |
|spritescale|vector | sprint scaling factor | sprint image | PTA, Default(1,1,1) |
|spriterot |float | sprite rotation factor | sprint image | PTA, Default 0 |
====参考资料====
* [[http://www.sidefx.com/docs/houdini/model/attributes|Geometry attributes]]\\
* [[https://www.sidefx.com/forum/topic/11090/|attribute name rule?]]: check symek's answer