======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