WWDC Quick Look 💓 By SwiftGGTeam
Create 3D models with Object Capture

Create 3D models with Object Capture

观看原视频

Highlight

macOS 上的 PhotogrammetrySession API 让你用几十张照片在几分钟内生成带材质贴图的 USDZ 3D 模型,支持从 Reduced 到 Raw 四种精度级别,Apple Silicon 上利用 Neural Engine 加速。

核心内容

你需要一个 3D 模型。传统做法:请专业建模师,花几小时甚至几天,按参考图一点点捏出形状、绘制贴图。成本高、周期长。

Object Capture 提供了另一条路:拍照片,传 Mac,跑代码,等几分钟,模型就出来了。

这个技术叫摄影测量(photogrammetry)。原理不新——用计算机视觉从多张 2D 照片恢复 3D 结构。新的是 Apple 把它做成了一个一行代码就能调用的 macOS API,而且针对 Apple Silicon 做了 Neural Engine 加速。

一个真实场景:你开了一家披萨店,想做一个 AR 菜单,让顾客用手机看 3D 披萨模型。以前要找外包建模。现在你自己拍一圈照片,用 Object Capture 生成模型,直接丢进 AR Quick Look。

详细内容

创建 PhotogrammetrySession

06:56

API 在 RealityKit 框架里。最基本的用法:指定一个包含照片的文件夹,创建 session。

import RealityKit

let inputFolderUrl = URL(fileURLWithPath: "/tmp/Sneakers/", isDirectory: true)
let session = try! PhotogrammetrySession(
    input: inputFolderUrl,
    configuration: PhotogrammetrySession.Configuration()
)

关键点:

  • 照片可以是 iPhone、iPad、单反甚至无人机拍的
  • 如果用 iPhone 12 Pro 等支持深度感应的设备拍摄 HEIC 格式照片,API 会自动提取深度数据恢复真实尺寸和重力方向
  • 也支持高级用法:逐张传入 PhotogrammetrySample,每张可以附带深度图、重力向量或自定义分割掩码

处理异步输出流

09:26

Session 创建后,需要连接输出流来接收进度和结果。StoreKit 2 用 Swift 的 AsyncSequence 实现:

Task {
    do {
        for try await output in session.outputs {
            switch output {
            case .requestProgress(let request, let fraction):
                print("Request progress: \(fraction)")
            case .requestComplete(let request, let result):
                if case .modelFile(let url) = result {
                    print("Request result output at \(url).")
                }
            case .requestError(let request, let error):
                print("Error: \(request) error=\(error)")
            case .processingComplete:
                print("Completed!")
                handleComplete()
            default:
                break
            }
        }
    } catch {
        print("Fatal session error! \(error)")
    }
}

关键点:

  • for try await 循环会持续接收消息,直到 session 被释放或发生致命错误
  • .requestProgress 可以用来驱动进度条
  • .requestComplete 返回模型文件 URL
  • .processingComplete 表示所有排队的请求都处理完毕

同时生成多个精度级别的模型

13:44

一次调用可以同时请求多个输出,引擎会共享计算,比顺序请求更快:

try! session.process(requests: [
    .modelFile("/tmp/Outputs/model-reduced.usdz", detail: .reduced),
    .modelFile("/tmp/Outputs/model-medium.usdz", detail: .medium)
])

关键点:

  • 同时请求多个 detail level 可以复用中间计算结果
  • 甚至可以一次请求所有四个级别
  • process() 会立即返回,结果通过输出流异步送达

四种输出精度

23:51

级别用途包含材质
Preview交互式预览,质量最低但生成最快-
Reduced网页/移动端 AR,低面数Diffuse, Normal, AO
Medium单模型高细节展示Diffuse, Normal, AO
Full游戏/后期制作,最高几何细节Diffuse, Normal, AO, Roughness, Displacement
Raw专业工作流,最大面数+原始纹理仅最大漫反射纹理,需自行处理材质

关键点:

  • Reduced/Medium 已压缩优化,可直接用于 AR Quick Look
  • Full 烘焙了 PBR 材质,适合大多数渲染场景
  • Raw 给有自有管线的工作室,面数和纹理细节最高但需后期处理

交互式工作流

15:28

除了直接生成最终模型,API 还支持交互式工作流:

  1. 先请求 detail: .preview 生成低质量预览模型
  2. 同时请求 .bounds 获取估计的捕获体积
  3. 在 UI 中调整 bounding box,裁剪掉不需要的部分(比如支撑物体的底座)
  4. 调整 root transform(缩放、平移、旋转)
  5. 用调整后的 geometry 参数请求最终模型

这个流程可以消除后期编辑需求,同时优化内存使用。

拍摄最佳实践

20:08

  • 物体选择:选有充足纹理细节的物体。避免透明、高反光区域。物体需要是刚性的,翻转拍摄时不能变形
  • 背景:放在简洁背景上,物体要突出
  • 拍摄方式:围绕物体缓慢移动,确保均匀覆盖所有角度。20-200 张特写照片通常足够
  • 重叠度:相邻照片之间保持高重叠度
  • 构图:尽量让物体占满画面,根据物体尺寸选择横拍或竖拍
  • 翻转拍摄:如需重建底部,翻转物体继续拍摄
  • 推荐方案:转盘 + 柔光箱 + 均匀照明,用 CaptureSample App 的定时快门同步转盘转动

Apple 提供了 CaptureSample App(SwiftUI 编写),演示如何在 iOS 上拍摄带深度和重力数据的高质量照片。支持手动和定时快门模式,画廊可快速检查照片质量。

核心启发

  1. 做一个电商商品的 3D 展示工具。用 iPhone 拍一圈商品照片,上传到 Mac 自动生成 Reduced 精度的 USDZ,嵌入网页 AR Quick Look。顾客用手机就能看 3D 商品。入口 API:PhotogrammetrySession + .reduced

  2. 做一个文物数字化存档系统。博物馆用单反拍摄文物,生成 Full 精度模型存档,同时输出 Medium 精度供线上展览。入口 API:PhotogrammetrySession + 多 detail level 同时请求。

  3. 做一个家具摆放 AR 应用。用户拍自家家具生成 3D 模型,然后在新房里用 AR 预览摆放效果。利用 iPhone 深度数据自动恢复真实尺寸。入口 API:PhotogrammetrySession + HEIC 深度数据。

  4. 做一个食品菜单 3D 化工具。餐厅拍菜品照片,几分钟生成 3D 模型,顾客扫码看旋转的 3D 菜品。入口 API:PhotogrammetrySession + ARQuickLook

  5. 做一个交互式模型精修工具。先请求 preview 模型,让用户在 UI 中调整裁剪框和旋转,确认后再生成 Full 精度输出。省去外部 3D 编辑软件。入口 API:PhotogrammetrySession + .preview + geometry 参数。

关联 Session

评论

GitHub Issues · utterances