USD 通用场景描述(Universial Scene Description)

USD是指Pixar皮克斯动画公司制定的通用场景描述(Universal Scene Description,USD) 格式。
本文将从 USD概念、USD体系、USD简易教程、USD在UE中的应用、USD相关资源,这五个方面展开阐述。

USD的诞生是为了解决场景描述通用性的问题,所以,学好USD最重要的两点是:

  • 理解USD构建场景的思路和体系结构
  • 熟练使用USD提供的 API 以及 工具集



一、USD概念

1. 什么是USD?

USD,是指通用场景描述(Universal Scene Description),用于稳健而且可扩展地交换及增强任意3D场景,而这些场景可能包含众多基本资产。USD不仅提供多类工具集,可用于阅读、写作、编辑和快速预览3D几何图形和着色,还提供元素资产(例如模型)或动画的交换,是3D场景在不同创作工具之间相互交换的桥梁。

使用USD,就是为了提供一套针对3D数据的定义、包装、集成、编辑的统一语言。

针对几何相关的内容,USD提供了 UsdGeom 库。其定义了(OpenSubdiv适用的)网格体、变换、曲线、点、nurbs patches、穿插在几何体表面的各种属性、几何相关的扩展和集成、计算边界框等等。

针对着色,USD提供了 UsdShade 库。其定义了可以连接入网络、打包到可复用材质的基本着色节点,基于此特性,用户可以创建公共接口用于修改着色网络中的参数。它为几何体与材料的绑定提供了巨大的灵活性。

USD重新定义了模型(Model)和资产(Asset)的概念。为了更好地描述和管理较大的 Prims(USD中最基本的容器对象),用 Model 来表示某些特定的Prims。叶节点Model被称作Compoent。组成Model的Model被称作Group,而发布后的Group(一种Asset)被称作 AssemblyAsset 在USD中指底层的某个独一无二的外部资产文件,它也可以指代场景中的某个由一串字符标识的物件。同时 “asset” 也是USD中的一个基本类型,对应C++中的SdfAssetPath类。

USD不是一个应用,而是一个体系。它可以文件格式,可以是一系列工具,也可以是集成在其它任何应用中的插件。

2. USD的特点

  • 支持不同文件格式
    对应抽象类SdfFileFormat
    二进制文件(.usdc)
    文本文件(.usda)
    压缩文件(.usdz)

  • 统一的API
    C++
    USD - C++API手册: https://graphics.pixar.com/usd/release/api/index.html
    Python
    USD - PythonAPI指南: https://developer.nvidia.cn/usd/apinotes
    USD - Python调用示例:
    用Python接口创建一个USD Layer
    参考和覆写
    JupyterLab

  • 丰富的工具集
    usdedit
    此工具将.usd文件转换成临时的.usda文件,并用编辑器打开它。编辑器是可选择的,通过环境变量 EDITOR 指定用哪个编辑器。
    usdcat
    此工具用于查看usd文件,可以将.usd文件输出到stdout或者某个指定文件。也可以用于转换.usdc文件。
    usddiff
    此工具将对比两个usd文件的差异(对比的是usdcat的输出结果)。
    usdview
    这是USD提供的功能最全的工具,它可以打开usd文件并提供了3D交互界面、场景树导航、一系列的诊断工具以及内嵌的Python解释器。
    usdrecord
    此工具是命令行工具,用于生成某个 USD Stage 的图片或者图片序列。图片的生成工作由Hydra完成,等同于 usdview 中预览到的画面。
    usdresolve
    此工具用于解析资产路径(asset path)。
    usdtree
    此工具在终端以Unix风格输出USD Layer的树形结构。
    usdzip
    此工具用于压缩多个usd文件,生成一个.usdz文件。
    usdchecker
    此工具用于验证.usd或者.usdz文件的有效性,确保Hydra能够对其进行有效渲染。
    usdstitch
    此工具可以集成数个usd文件到一个独立的usd文件。此过程与flatten操作不同。
    usdstitchclips
    usddumpcrate
    USD的自定义二进制格式文件(后缀.usdc),被称作USD Crate File,此工具可以提供usdc文件信息,用于底层低级调试。
    sdfdump
    sdffilter

  • 多人同时修改同一资产或场景
    NVIDIA - Omniverse 英伟达官网下载地址
    Nvidia Omniverse Launcher 非常强大,它集成了Omniverse平台提供的各种功能性应用,以及生态链上的各种第三方应用,其中就包括USDView。 在EXCHANGE页面可以进行浏览、下载,在LIBRARY界面可以启动已安装好的应用。
    Nvidia Omniverse Launcher -  EXCHANGE
    Nvidia Omniverse Launcher - LIBRARY



二、*USD体系

1. 体系结构

Layer

Prims

Attributes ( has basic types )
Relationships

Model

2. 场景描述文件

示例一 - Kitchen_set

整个Kitchen_set的场景在USDView中打开后,界面如下。

这里可以更直观地了解到USD描述场景的思想,即 分而治之

  1. 厨房被分成西边、北边、餐桌、天花板,四个区域。
  2. 以餐桌区域为例,又被分成了桌子、椅子A、椅子B、桌上物品,四个部分。
  3. 以桌上物品为例,又按照更具体的概念,被分成各个物品,包括勺子,茶杯,装满麦片的碗,蜡笔等等。
  4. 展开装满麦片的碗,其中有包含两个部分,碗和麦片(展开可见,麦片由100多个独立的单个麦片组成)。
  5. 展开碗,里面只有碗的几何描述。此时,对于场景构成的描述已经无法继续展开。

Kitchen_set on usdview
我们来分析一下这个场景对应的usd文件:
打开 Kitchen_set.usd 发现其组织结构和在 USDView 中的“世界树”完全一致。

Kitchen_set
MeasuringSpoon

Kitchen_set (xform / assembly )

Props_grp (xform / group)

North_grp (xform / group)

NorthWall_grp (xform / group)

MeasuringSpoon_1 (具体物件,references指向一个引用的资产,xformOp指定了物件在场景中的位置)
MeasuringSpoon_2

打开 references 指向的 ./assets/MeasuringSpoon/MeasuringSpoon.usd
发现文件引用链是 MeasuringSpoon.usd >> MeasuringSpoon_payload.usd >> MeasuringSpoon.geom.usd
最终指向一个二进制文件用于构建我们的勺子的Mesh

MeasuringSpoon.usd
MeasuringSpoon_playload.usd

示例二 - Parkinglots

(Un)instanced
Parkinglot.usd
BuyNLarge

4. 重要名词

  • Assembly
    是一种特殊的模型(Model),它是群组模型,是由其它模型组成的有意义的集合。它包含的模型都是已发布的资产。

  • Asset
    Asset本来就是内容生产管线中的常见的名次,在USD中,Asset可以由一个字符串标识。为了更好地支持资产相关的操作,USD定义一种基本类型就叫 asset,对应C++中的SdfAssetPath类。在 .usda 文件中,用 @ 开头的字符来表示 asset 的值。

  • AssetInfo
    用来描述Asset的结构,包含四个核心字段,分别是 identifier(asset类型,指向一个具体的asset)、name(string类型,asset名称)、payloadAssetDependencies(asset[]类型,用于动态资产依赖分析)、version (string类型,标识asset版本)。

  • Attribute
    Property分为Attribute和RelationShip。Attribute是USD中的基本性质,它可以采用的基本类型参见
    https://graphics.pixar.com/usd/release/api/_usd__page__datatypes.html

  • Class
    Class是Prim的一种。可以通过 UsdPrim::IsAbstract 来判断其是否为抽象。

  • Component
    Component是位于叶子节点的Model。它可以包含Subcomponents,但是不能再包含其它Model。

  • Composition
    Composition是集成多个Layers的过程。它发生在第一次打开UsdStage、加载或卸载Prims,以及Stage中的Layer被编辑时。

  • Group
    Group是一种Model。它是多个Model的集合。通常来说,Group是被集成在Assembly中的。

  • Layer
    Layer是Prim的容器。一般而言,Layer对应物理文件上的一个.usd文件。

  • LayerStack

  • Prim
    USD中的基本容器对象。一个Prim可以包含其它Prim,Prim也可以包含Properties(属性),Prim一般都会拥有Specifier(说明符)来指示它在场景中扮演的角色。相关API参见UsdPrim。

  • Property
    包括 Attribute 和 Relationship 两种。

  • Relatinship
    是Property的一种,是指向多个命名空间的指针。在.usd文件中的关键字是rel。

  • Specifier
    标识符,类似与C++中的class或struct,在.usd文件中用来定义一个Prim。具体的Specifier可以是 “def”、“over” 或 “class”。

  • Subcomponent
    表示Component内部的某个可能比较重要的Prim。和Component不同,它并不是一种Model。

  • SubLayers
    SubLayers是一种组织结构,它是包含多个.usd文件的数组。subLayers中每个.usd文件仍可以继续嵌套更多的subLayers。



三、USD简易教程

创建第一个USD场景

打开 USD/extras/usd/tutorials/helloWorld/helloWorld.py,此Python脚本用于创建并导出一个简单场景,里面包含了一个变换和一个球体。打开python文件后可以看到:

from pxr import Usd, UsdGeom
stage = Usd.Stage.CreateNew('HelloWorld.usda')
xformPrim = UsdGeom.Xform.Define(stage, '/hello')
spherePrim = UsdGeom.Sphere.Define(stage, '/hello/world')
stage.GetRootLayer().Save()

执行Python脚本,执行后会生成 .usda 文件

$ python extras/usd/tutorials/helloWorld/helloWorld.py

UsdView 打开 HelloWorld.usda

$ usdview HelloWorld.usda

HelloWorld.usda
.usda 文件可以用 usdcat 打开,也可以用 usdedit 进行编辑。
打开后会看到结构性的文字描述,例如:

#usda 1.0
def Xform "hello"
{
    def Sphere "world"
    {
    }
}



四、USD在UE中的应用

为了避免赘述,这里只放上UE4关于USD的官方文档链接:
https://docs.unrealengine.com/4.26/zh-CN/WorkingWithContent/USDinUE4/



五、USD相关资源

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值