Highlight
Apple 推出 USDKit 框架,让 Swift 开发者可以用原生 API 创建、编辑和导出 USD 场景,并在 Mac 预览 App 中直接处理 3D 内容,同时 Safari 新增
<model>标签支持网页原生嵌入 3D 模型。
核心内容
以前处理 3D 场景是个麻烦事
如果你在 Apple 平台上做过 3D 内容开发,大概率遇到过这样的困境:USD(Universal Scene Description)是事实上的行业标准,但官方只有 C++ API。Swift 开发者要么写桥接代码,要么依赖社区维护的 SwiftUSD 绑定。场景组装、层级遍历、属性修改,每一步都要和 SdfPath、UsdPrim 这些 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,根据节点名称或类型自动推断 label 和 description,写入 AccessibilityAPI 模式。让视障用户也能通过 VoiceOver 探索你的 3D 内容。入口是 stage.descendants 和 applyAPISchema(_:instanceName:)。
4. 做一个轻量级 USD 场景编辑器
基于 USDKit 的 definePrim、references.add 和 addTransformOperation 构建一个节点编辑器,让用户拖拽组合 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