问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/krabbit1997/article/details/126453881

USD(通用场景描述)是由Pixar皮克斯动画公司制定的一种用于稳健且可扩展地交换及增强任意3D场景的格式。本文将从USD概念、USD体系、USD简易教程、USD在UE中的应用、USD相关资源五个方面展开阐述。

USD概念

什么是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不是一个应用,而是一个体系。它可以文件格式,可以是一系列工具,也可以是集成在其它任何应用中的插件。

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调用示例:

  • 丰富的工具集

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界面可以启动已安装好的应用。


USD体系

体系结构

Layer
Prims
Attributes ( hasbasic types)
Relationships

场景描述文件

示例一 -Kitchen_set

整个Kitchen_set的场景在USDView中打开后,界面如下。这里可以更直观地了解到USD描述场景的思想,即分而治之

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

我们来分析一下这个场景对应的usd文件:

打开 Kitchen_set.usd 发现其组织结构和在 USDView 中的“世界树”完全一致。

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

示例二 - Parkinglots



重要名词

  • 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

.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相关资源

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号