Houdini Solaris USD基础概念(一)
基本概念
Primitives (prims)
prims是USD的基本“单位”,在谈论USD时,"Primitive"通常缩写为"prim"。类似于在HTML中的 "element" 。prim有一个名称,0个或多个命名属性,以及0点或多个子级,例如,多边形网络是个prim,灯光是一个prim,材质是一个prim。"xform"prim存储适用于其子prim的transform。
Prims是定义阶段的对象树中的“节点”。
Properties特性, attributes属性, relationships关系
"Property" 是可以附加到prim类型的两种命名数据的通用名称:
Metadata 元素据
属性本身可以附加有命名值,这可以修改它们的工作方式,例如,如果为mesh指定颜色primvar ,则可添加interpolation元数据,该元数据指定渲染器应如何在这些点的颜色之间混合。
元素据还用于附加“附加”数据,这些数据可能特定于DCC,或者对于调试或构建用户界面很有用。例如,不同属性的文档存储在元素据中。
Layers层
一个.usd文件是一个层(.usdz文件,一个文件可以在一个存档文件中包含多个层)。一个层可以表示场景的一个片段,例如,道具,角色,装备的一部分,灯光设置等。它还可以表示用来创建基准的默认值,例如包含镜头序列设置的图层,您可以在代表该序列中每个镜头的文件中reference这些设置。
在Houdini中,各种节点创建新的内存层以覆盖现在数据。您可以使用Layer Break LOP手动创建一个新层,一个典型的LOP网络将涉及许多层。其中一些层是从磁盘导入的,某些层是由节点在内存中创建的,最后由这些层组成。(network editor中的可选可视化工具向您显示了网络中哪些节点在不同的层上工作。)
Composition arcs 合成操作符
从一层到另一层的引用。例如,场景图层可能会reference进包含道具,灯光等图层。这些图层可能reference自己的子层,这些子层可能会reference子子层,依此类推。
将各层复合在一起,合并每层中的prims。较高层中的属性将覆盖下面的属性。
例如,场景文件可以reference灯光层,但是灯光部门可能已经从 "base defaults", "finished lighting", 和"in-progress lighting"的三个子层组成了该层本身。其他部门不需要知道灯光层是如何组成的,他们只需要reference顶级的lighting层既可。
在Houdini中,可以使用Reference LOP ,使用LOP网络中的节点将参考添加到要在内存中构建的层。你可以使用 Sublayer LOP将现有子层(.usd文件)加载到当前阶段的层堆栈中。
Stage舞台
当加载USD文件和系统组成的所有层结合在一起来计算prims的最后场景图,该结果被称为Stage。请注意,stage只是结果的名称。“stage文件”和“layer文件”之间没有区别,如果将.usd文件加载为"top-level"文件,它将创建一个新的stage。在另一种情况下,你可以将同一文件作为不同stage的图层引用。
在Houdini中,位于网络项部的LOP节点创建一个stage,随后的每一个LOP会按程序修改该阶段的内容,从而创建一个新阶段。因此,对于任何LOP节点,您都可以使用hou.LopNode.stage()获取该节点输出的stage对象。您可以usda通过右键单击LOP节点选择LOP Actions ▸ Inspect Flattened Stage来查看节点以语法形式显示的stage输出。
组成
每个USD文件都包含完整的“场景”。USD文件可以将其它USD文件的内容导入为图层。
USD库包括用于将多层合成、叠加到顶层文件创建的整个场景(stage)中的软件。组成包括合并各层之间的以下差异:
- New prims.(新prims)。
- Prim ordering.(Prim排序)。
- Whether a prim is active or inactive.(prim是活动还是不活动)。
- Variants.(变化)。
- New properties (attributes and relationships).(新特性(属性和关系))。
- Attribute values. (Higher layers can even "block" (unset) the value of an attribute so it appears to be unassigned).(属性值)。
- Metadata values.(元数据值)。
Houdini会自动组合您在编辑USD时创建的各种磁盘和内存层。你还可以使用工具来了解每个图层上的内容以及图层的组成方式。
Sublayers, references
USD具有两种“导入”另一个USD的内容的方法:sublayering 是将导入文件的树覆盖在当前树上,而reference是将导入树的内容作为分支附加到现有树上。
你可以将sublayering视为组成整个场景的不同版本(例如,将照明部门的场景版本与最终照明重叠在布局部门的场景版本中并使用照明)并将其视为场景添加一部分(例如,导入道具以开始布局)。
Sub-layering 子层
sublayering 将导入文件的内容覆盖在现有内容之上,每棵树关于具有相同路径的prims和具有相同名称的属性、元数据的opinions将基于opinion strength合并。
当合并每个文件都应构成整个场景一部分时,此功能很有用。例如,组成代表场景布局,道具,角色,特效,灯光的单独图层。
sublayering 的固有特征是“一切都仪在同一位置”。prims在新文件中的路径与其在源文件中的路径相同。
因为这些部门中的每个部门都在单独的子层中工作,所以他们不必担心共享单个文件和进行冲突的编辑。但是,因为它们都在同一场景图层次结构中工作,所以每个部门可以将更改应用于其他部门创建的任何内容。
Houdini中Sublayer LOP节点加载新的子层到场景中。LOP网络通常总是在空根层的最强子层。一些LOP节点可能会启动一个新的更强子层,然后再由所有后续LOP节点对其进行修改。这些网络输出的是此子层堆栈的组成。
Referencing 引用
Referencing将被Referencing文件并“移植”到当前树中的分支上。
Referencing有且于将较小的单个资产移植到较大的场景中。特别地,引用是在不同位置多次加载同一图层文件的唯一方法。(因为子分层适用于整个树,所以多次对同一文件进行子分层将无效。)
简单的垃圾桶资产
#usda 1.0
(
defaultPrim = "TrashCan"
)
def Xform "TrashCan" (
kind = "component"
)
{
def Cylinder "Can"
{
token axis = "Y"
bool doubleSided = 0
double height = 2
double radius = 1
}
}
一组中3个不同房间的引用垃圾桶的文件有3次资产
#usda 1.0
()
def Xform "Scene"
{
def Xform "Set"
{
def "BathroomTrashCan" (
append references = @./trashcan.usda@
)
{
double3 xformOp:translate = (2, 0, 1.4)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
def "KitchenTrashCan" (
append references = @./trashcan.usda@
)
{
double3 xformOp:translate = (16.01, 5, -43.072)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
def "OfficeTrashCan" (
append references = @./trashcan.usda@
)
{
double3 xformOp:translate = (-7.12, 0, 11.9)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
}
}
Houidni的Reference LOP和Stage Manager LOP创建references。 Graft LOP是相似的,但不是从一个文件引用,它插入一个分支到场景图树从LOP网络的其他地方。
Houdini跟踪多个层次的子层和引用如何协同工作以在单个场景图位置生成关于图元的最终意见可能会变得很复杂。你可以使用Scene Graph Details pane面板的Layer Stack和Composition选项卡来检查哪些层构成了primitive,以及如何将这些不同的层组合在一起。
Payloads 有效载荷
有效负载本质上是一个references,但是有可能让USD不加载有效负载,除非特别要求它们。这使您可以控制场景的哪些部分被加载到内存中,从而通过集中精力关注场景的各个部分来减少内存使用和处理时间。
在Houdini中,您可以在references文件的节点的参数中指定references的文件是纯引用还是有效负载。
默认情况下,Houdini加载所有有效负载(因此它们的行为与引用完全相同)。但是,场景图树中的Configure Stage LOP和Load Masks控件允许您禁用默认的有效负载加载,然后选择要加载的特定有效负载。
Activation and visibility 激活和可见性
由于USD是专为非破坏性编辑而设计的,因此不允许deleting( 删除) primitives。但是,您可以使用新值override(覆盖 ) primitives,或者deactivate(停用 ) primitives,以使它们不起作用。
您还可以编辑场景中对象的visibility可见性。默认情况下,USD prims是可见的。可见性选项只有两个设置:“inherit继承”和“invisible不可见”。因此,将prim 标记标记为“不invisible”也会使其所有后代也不可见。
在Houdini中,您可以在Scene Graph Tree面板中以交互方式在激活和不激活以及可见/不可见之间切换图元,以允许您查看图元的效果。Houdini在内存中未保存的图层中执行这些编辑,因此它们不会影响最终生成的USD。
Opinion strength Opinion 强度
属性根据“strongest wins”规则进行解析,因此任何给定属性的所有值都将从最强的PrimSpec中获取。例如,具有默认值的“弱层”将被具有动画的更强层掩盖。例如,layout部门在场景中放置了一个道具,然后动画部门添加了一个动画该道具的图层。
决定意见强度的最常见方法是图层堆栈的顺序。
例如,最薄弱的一层可能是layout层,在这里资产被合并和定位。下一层可以将动画部门的角色添加到场景中(如果有必要,可以通过对某些现有图元应用更强的opinions,动画部门可以移动或调整layout)。然后,FX部门可能要向场景图添加新的几何图形,或将RBD模拟应用于layout或动画部门添加的某些现有primitives。
Default primitive 默认primitive
作为其metadata的一部分,每一层都可以指定“默认primitive”。如果您在文件中进行referenc,但未明确指定要附加的文件中的根级别的prim ,则将引用该prim 。
- 您可以使用Configure Layer LOP为图层指定默认primitive(以及其他图层级metadata)。
- 当您写出USD文件时,USD render node具有用于设置“顶层”图层文件的默认prim的参数。
- 该USD render node有一个选项(Error Saving Layer With No Default Primitive)如果您还没有指定一个默认的primitive的所有层的被写到导致错误。