技术探究 通用场景描述(Universial Scene Description, USD)

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

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

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


一、USD概念

1. 什么是USD/h3>

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

    参考和覆写
    Nvidia Omniverse Launcher -  EXCHANGE
    Model

    2. 场景描述文件

    示例一 – Kitchen_set

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

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

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

    Kitchen_set
    MeasuringSpoon.usd
    (Un)instanced
    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文件后可以看到:

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

    UsdView 打开 HelloWorld.usda

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


    四、USD在UE中的应用

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


    五、USD相关资源

    • USD文件体系 Pixar官方介绍PDF Siggraph 2019 USD Introduction and Overview
    • USD官网 https://graphics.pixar.com/usd/release/index.html
    • USD官网 – 教程 https://graphics.pixar.com/usd/release/tut_usd_tutorials.html
    • USD官网 – API文档 https://graphics.pixar.com/usd/release/api/index.html
    • USD官网 – USD工具集 https://graphics.pixar.com/usd/release/toolset.html
    • USD官网 – FAQ https://graphics.pixar.com/usd/release/usdfaq.html#
    • Github源代码 https://github.com/PixarAnimationStudios/USD
    • NVIDIA Omniverse?(基于USD,可扩展的多 GPU 实时开发平台,用于3D仿真设计)https://developer.nvidia.cn/zh-cn/nvidia-omniverse-platform
    • UE4中的USD插件 https://docs.unrealengine.com/4.26/zh-CN/WorkingWithContent/USDinUE4/

    来源:wyk023

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月26日
下一篇 2022年7月26日

相关推荐