31-USD 文件的使用

839 阅读4分钟

ARKit系列文章目录

2019年WWDC的《 Session 602 - Working with USD 》 主要内容速览:

  • 什么是 USD.
  • 如何创建 USDZ,如何将其他文件转换为 USDZ.
  • USD 概要.
  • USD 的特色功能.

什么是 USD

USD是指Universal Scene Description (通用场景描述文件) 是Pixar开发的 3D 文件格式,使用 c++ 开发,可使用 Python 调用。主要优势是速度快,扩展性强,可多人协作

USD 文件有多种类型:

  • USDA:plain 格式的文本文件,可供开发人员直接阅读检查。
  • USDC:二进制格式的文件,可用于实际开发中使用。
  • USD:plain 或者二进制格式。
  • USDZ:USD 的零压缩格式,64 字节对齐,包含场景文件(USD)和纹理图片(.png/jpeg)

可以看出 USDZ 本质就是将 USD 文件(USDA、USDC、USD、USDZ)和纹理图片(png、jpeg)压缩成一个文件,方便进行分享和预览。

不同的 3D 格式文件对比

  • obj:只支持单个 3D 模型
  • gltf,fbx,abc:支持多模型和场景树
  • usd:支持多模型和场景树,支持复杂场景的灵活扩展,支持实时创作和多人协作
  • usdz:支持多模型和场景树,支持复杂场景的灵活扩展,不支持实时创作和多人协作

创建与转换

转换为 USD 文件

苹果给出了新的命令行工具USDZ tool 下载 该工具基于 Python,可独立于平台,支持obj,gltf,fbx,abc等格式,并支持执行素材的校验。

示例使用如下:

创建 USD 文件

目前已经有 Adobe 的Substance Painter,Autodesk 的Maya支持直接导出 usd/usdz 格式的素材了。 我们还可以在 Xcode 通过代码从 SCNScene 中导出 .usdz 文件,或者从 Xcode 的 3D 编辑器中直接保存为 .usdz 文件

USD 概要

Basic File Structure(基本文件结构)

以 USDA 文件为例,USDA 文件的设计原则就是为了可读性,让开发者能直接读懂 3D 文件的内部结构。如下,嵌套的组件(prime)可以直接用路径来访问,/simpleMesh/cube就可以访问内部的组件,而内部的属性则可以用*/simpleMesh/cube.normals* 来访问

Scene Gragh(场景关系图)

场景的关系是指场景中物体的继承关系或兄弟关系,这些都包含在文件定义中,当父节点被移动时,他的所有子节点也会受到影响

Mesh Data(网格数据)

Mesh Data 可以粗略地分成两类:

  • Mesh attributes(网格属性) :比如顶点位置,法线,纹理坐标
  • Mesh connectivity(网格关系):比如每个面有多少个点,哪些点属于这个面

下面图中示例,points是顶点坐标,faceVertexCounts是每个面的顶点数,faceVertexIndices则是顶点索引。normals是四个面的法线,每个面的插值设为uniformprimvars则是纹理坐标,插值设为faceVarying。 最后,我们希望是多边形来渲染,所以细分曲面设置为none

Materials(材质)

USD 致力于提供真实感的实时渲染,支持两种渲染流程:

  • Metallic-roughness
  • Specular-roughness

这里我们主要关注 Metallic-roughness 渲染流程 USD 中是以 shader Node 的形式连接起来,来处理材质的。流程如图 在 USD 文件中,是这样呈现的:

这里用到的示例文件/代码,都可以在新的命令行工具USDZ tool 下载里面samples文件夹下找到

USD 特色功能

与其他 3D 格式相比,USD 的特色功能主要有两个:曲面细分与创作引擎

细分曲面 Subdivision Surfaces

  • 细分曲面技术可以高效地呈现曲面
  • 动态的平面填充(如根据到摄像机的距离)
  • 非常适合于有动画的曲面

苹果采用的是Pixar开发的OpenSubdiv技术,这是一种工业标准的细分曲面技术。苹果还与Pixar进行了合作,使得 Metal shader 能在 GPU 上高效完成该处理。同时OpenSubdiv技术也是 SceneKit 中细分曲面的基础。

苹果在 Memoji 中就使用曲面细分技术

创作引擎 Composition Engine

支持多人协作编辑,最典型的例子是:引用类型

普通的 3D 文件树中,如果有相同的子元素,那么就会存在重复 使用引用类型可以解决重复问题,但是当修改其中一个子元素时,又会影响其他元素 USD 中会为重复的子元素创建虚拟的占位对象,这样修改其中一个时,不会影响其他元素的属性。

这里用到的示例文件/代码,都可以在新的命令行工具USDZ tool 下载里面samples文件夹下找到。

参考

WWDC 2019 相关视频