WWDC Quick Look 💓 By SwiftGGTeam
Discover USDKit and what's new in OpenUSD

Discover USDKit and what's new in OpenUSD

观看原视频

Highlight

Apple 推出 USDKit 框架,让 Swift 开发者可以用原生 API 创建、编辑和导出 USD 场景,并在 Mac 预览 App 中直接处理 3D 内容,同时 Safari 新增 <model> 标签支持网页原生嵌入 3D 模型。

核心内容

以前处理 3D 场景是个麻烦事

如果你在 Apple 平台上做过 3D 内容开发,大概率遇到过这样的困境:USD(Universal Scene Description)是事实上的行业标准,但官方只有 C++ API。Swift 开发者要么写桥接代码,要么依赖社区维护的 SwiftUSD 绑定。场景组装、层级遍历、属性修改,每一步都要和 SdfPathUsdPrim 这些 C++ 类型打交道。

更麻烦的是协作。美术用 Blender 或 Maya 导出模型,开发者在代码里手动拼接,双方各自维护一份场景描述。美术更新了模型位置,开发者得重新写死坐标。没有统一的场景图(Scene Graph)管理机制,项目越大越难维护。

USDKit 把 USD 变成了 Swift 的一等公民

08:12)USDKit 是 Apple 今年新推出的系统框架,把 USD 的核心概念包装成了符合 Swift 习惯的 API。创建场景、遍历层级、修改属性、导出资产,全部用 Swift 原生语法完成。

它的设计思路很明确:懂 USD 的人会觉得概念熟悉,懂 Swift 的人不需要先学 C++ 就能上手。USDStage 对应舞台,USDPrim 对应场景节点,references.add() 实现轻量级引用——这些 API 命名直接映射到 USD 的核心概念,学习成本很低。

3D 工作流从 Mac 延伸到 Vision Pro

04:24)macOS 27 的预览 App(Preview)不再只是看图工具,它现在支持直接编辑 3D 场景:拖拽物体、调整属性、修改灯光、转换和压缩资产。背后有三种渲染器可选:RealityKit 保证跨平台一致性,Storm 服务现有生产管线,新增的 Raytracer 提供物理正确的光线追踪效果。

05:42)通过 Spatial Preview 框架,Mac 上的修改可以实时同步到 Vision Pro 的 Quick Look 中。团队可以通过 SharePlay 一起进入同一个空间场景,边走边看光照和构图。这个工作流以前需要专业 DCC 软件和复杂的导出流程,现在一台 Mac 就能完成。

Safari 原生支持 3D 内容

06:25)Safari 新增了 <model> 标签,像嵌入图片一样嵌入 3D 模型。macOS 和 iOS 上用户可以直接在浏览器里交互查看,visionOS 上模型还能从网页中”破屏”进入用户的空间。这意味着电商展示、产品配置器、教育内容等场景不再需要引入 Three.js 或 Babylon.js,一行 HTML 就能搞定。

详细内容

打开和遍历 USD Stage

08:12)USDKit 的入口是 USDStage。你可以创建一个空内存舞台,也可以从磁盘文件打开。

import USDKit

// 创建一个新的空内存舞台
let stage = USDStage()

// 从磁盘文件打开舞台
let url = URL(fileURLWithPath: "/ALab/entry.usda")
let stage = try USDStage.open(url)

关键点:

  • USDStage() 创建内存中的空舞台,适合程序化生成场景。
  • USDStage.open(url).usda.usdc.usdz 文件加载,涉及文件 IO,需要 try
  • 加载成功后,场景立即可用,不需要额外的异步回调。

08:44)遍历场景层级查找特定节点:

// 遍历所有后代节点,查找名为 scope 的仪器
for prim in stage.descendants {
    if prim.name == "scope" {
        // 找到了
    }
}

// 没找到,在指定路径定义一个新的 Xform 节点
let scope = stage.definePrim(at: "/World/scope", type: "Xform")

// 添加文件引用,不拷贝数据
try scope.references.add("/ALab/assets/scope.usda")

关键点:

  • stage.descendants 提供惰性遍历,按深度优先顺序访问所有后代节点。
  • definePrim(at:type:) 在指定路径创建节点,路径是 USD 中的唯一标识符。
  • references.add() 是 USD Composition 的核心机制:不嵌入数据,只引用外部文件。上游更新后,重新加载舞台即可自动同步。

用 Transform Operation 移动物体

09:36)USDKit 把 USD 的变换操作包装成了 Swift 友好的 API:

// 创建平移变换操作,自动更新 xformOpOrder
scope.addTransformOperation(type: .translate)

// 设置平移值
scope["xformOp:translate", as: USDValue.Vec3d.self] = [2.5, 0.0, -1.0]

关键点:

  • addTransformOperation(type:) 自动创建 xformOp:translate 属性并维护 xformOpOrder,开发者不需要手动管理变换顺序。
  • 下标语法 scope[key, as: Type.self] 是 USDKit 读写属性的统一方式,类型安全且符合 Swift 习惯。
  • USDValue.Vec3d 对应三维双精度向量,适合场景级别的坐标描述。

给 3D 物体添加无障碍信息

10:42)Apple 把无障碍元数据的标准化推进到了 USD 层面,让视障用户也能通过 VoiceOver 理解 3D 场景中的物体:

// 应用 AccessibilityAPI 模式,实例名设为 "default"
try scope.applyAPISchema("AccessibilityAPI", instanceName: "default")

// 创建标签和描述属性
scope.makeAttribute(named: "accessibility:default:label", as: .string)
scope.makeAttribute(named: "accessibility:default:description", as: .string)

// 设置属性值
scope["accessibility:default:label", as: String.self] = "Oscilloscope"
scope["accessibility:default:description", as: String.self] =
    "Vintage signal analyzer with a 3D wireframe display, topped by a color bar test monitor"

关键点:

  • applyAPISchema(_:instanceName:) 给节点附加模式(Schema),声明该节点支持无障碍 API。
  • 属性名遵循 accessibility:{instanceName}:{property} 的命名约定,这里是 accessibility:default:label
  • makeAttribute(named:as:) 创建属性,as: .string 指定属性类型。
  • 标签(label)要简洁,描述(description)要丰富,两者配合让辅助技术能准确传达物体信息。
  • Apple 已经在 Blender 和 Maya 中直接支持了这个标准,美术可以在建模阶段就写入无障碍数据。

导出压缩后的 USDZ

12:05)生产级 USD 场景动辄数 GB,USDKit 内置了网格和纹理压缩:

let output = URL(fileURLWithPath: "/ALab/alab_compressed.usdz")

// 导出为 USDZ 包
try stage.exportPackage(
    to: output,
    options: [
        .preferSmallTextureFiles(quality: .standard),   // AVIF 纹理压缩
        .preferSmallMeshFiles                           // 网格几何压缩
    ]
)

关键点:

  • exportPackage(to:options:) 把舞台导出为 .usdz 格式,这是 Apple 平台推荐的打包格式。
  • .preferSmallTextureFiles(quality:) 用 AVIF 压缩纹理,.standard 质量在体积和画质间取平衡。
  • .preferSmallMeshFiles 启用网格压缩,配合 Alliance for Open Media 的新编码,网格体积最高可减少 90%。
  • 两者结合,平均资产体积缩小到原来的 1/7。
  • 不用写代码的话,Mac 预览 App 和 usdcrush 命令行工具也能做同样的压缩。

核心启发

1. 做一个支持实时协作的 3D 资产审查工具

用 USDKit 加载场景,通过 Spatial Preview 框架把画面推送到 Vision Pro。团队成员戴上头显后可以在同一个空间里走动查看,用 SharePlay 同步视角。入口 API 是 USDStage.open() 和 Spatial Preview 的实时同步机制。

2. 在电商 App 里做原生 3D 产品展示

用 USDKit 组装产品变体(不同颜色、配件组合),导出压缩后的 USDZ,通过 <model> 标签嵌入网页。 visionOS 用户可以直接把产品”拿”到现实空间里查看。核心 API 是 exportPackage(options:) 和 Safari 的 <model> 标签。

3. 给现有 3D 内容批量添加无障碍支持

遍历场景中的每个 USDPrim,根据节点名称或类型自动推断 labeldescription,写入 AccessibilityAPI 模式。让视障用户也能通过 VoiceOver 探索你的 3D 内容。入口是 stage.descendantsapplyAPISchema(_:instanceName:)

4. 做一个轻量级 USD 场景编辑器

基于 USDKit 的 definePrimreferences.addaddTransformOperation 构建一个节点编辑器,让用户拖拽组合 3D 资产、调整位置、导出压缩包。比 Blender 轻量,比纯代码灵活。

5. 把 Gaussian Splats 和传统模型混用

OpenUSD 今年新增了 Particle Fields 基础类型,支持 Gaussian Splats。用 USDKit 创建一个同时包含传统网格和粒子场的场景,在 RealityKit 中渲染。适合做真实场景扫描 + 虚拟物体叠加的应用。

关联 Session

  • Spatial Preview — 了解如何在 Mac App 中集成 Spatial Preview 框架,实现 Mac 到 Vision Pro 的实时 3D 预览
  • RealityKit — USDKit 与 RealityKit 深度集成,学习如何用 RealityKit 渲染 USDKit 组装的场景
  • Reality Composer Pro 3 — 可视化 3D 内容创作工具,与 USDKit 形成代码 + 工具的双轨工作流
  • Immersive Web — Safari <model> 标签的深层技术细节,以及网页端 3D 内容的更多可能性
  • 3D Models — 了解 USD 模型在 Apple 平台上的最佳实践和优化策略

评论

GitHub Issues · utterances