基本概念
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 类型的两种命名数据的通用名称:
Attributes 属性:属性是描述 prim 的类型化值(例如整数,颜色,变换矩阵,数组等)(例如,float size = 1.0 定义 Cube Prim 的统一大小)。这是最为常见的 property。
Relationships 关系:关系是在一个 prim 和另一个 prim 之间建立的链接(例如,指定对 mesh prim 的 shader 要使用的材质,或指定 collection 中的 primitives)。
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 的所有层的被写到导致错误。