USD的诞生是为了解决场景描述通用性的问题,所以,学好USD最重要的两点是:
- 理解USD构建场景的思路和体系结构
- 熟练使用USD提供的 API 以及 工具集
一、USD概念
1. 什么是USD/h3>
针对几何相关的内容,USD提供了 UsdGeom 库。其定义了(OpenSubdiv适用的) 格体、变换、曲线、点、nurbs patches、穿插在几何体表面的各种属性、几何相关的扩展和集成、计算边界框等等。
针对着色,USD提供了 UsdShade 库。其定义了可以连接入 络、打包到可复用材质的基本着色节点,基于此特性,用户可以创建公共接口用于修改着色 络中的参数。它为几何体与材料的绑定提供了巨大的灵活性。
USD重新定义了模型(Model)和资产(Asset)的概念。为了更好地描述和管理较大的 Prims(USD中最基本的容器对象),用 Model 来表示某些特定的Prims。叶节点Model被称作Compoent。组成Model的Model被称作Group,而发布后的Group(一种Asset)被称作 Assembly。Asset 在USD中指底层的某个独一无二的外部资产文件,它也可以指代场景中的某个由一串字符标识的物件。同时 “asset” 也是USD中的一个基本类型,对应C++中的SdfAssetPath类。
USD不是一个应用,而是一个体系。它可以文件格式,可以是一系列工具,也可以是集成在其它任何应用中的插件。
2. USD的特点
-
统一的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调用示例:
2. 场景描述文件
示例一 – Kitchen_set
整个Kitchen_set的场景在USDView中打开后,界面如下。
这里可以更直观地了解到USD描述场景的思想,即 分而治之:
- 厨房被分成西边、北边、餐桌、天花板,四个区域。
- 以餐桌区域为例,又被分成了桌子、椅子A、椅子B、桌上物品,四个部分。
- 以桌上物品为例,又按照更具体的概念,被分成各个物品,包括勺子,茶杯,装满麦片的碗,蜡笔等等。
- 展开装满麦片的碗,其中有包含两个部分,碗和麦片(展开可见,麦片由100多个独立的单个麦片组成)。
- 展开碗,里面只有碗的几何描述。此时,对于场景构成的描述已经无法继续展开。
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。 -
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
四、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/
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!