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
是四个面的法线,每个面的插值设为uniform
。primvars
则是纹理坐标,插值设为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 相关视频