Highlight
macOS 上的
PhotogrammetrySessionAPI 让你用几十张照片在几分钟内生成带材质贴图的 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 还支持交互式工作流:
- 先请求
detail: .preview生成低质量预览模型 - 同时请求
.bounds获取估计的捕获体积 - 在 UI 中调整 bounding box,裁剪掉不需要的部分(比如支撑物体的底座)
- 调整 root transform(缩放、平移、旋转)
- 用调整后的 geometry 参数请求最终模型
这个流程可以消除后期编辑需求,同时优化内存使用。
拍摄最佳实践
(20:08)
- 物体选择:选有充足纹理细节的物体。避免透明、高反光区域。物体需要是刚性的,翻转拍摄时不能变形
- 背景:放在简洁背景上,物体要突出
- 拍摄方式:围绕物体缓慢移动,确保均匀覆盖所有角度。20-200 张特写照片通常足够
- 重叠度:相邻照片之间保持高重叠度
- 构图:尽量让物体占满画面,根据物体尺寸选择横拍或竖拍
- 翻转拍摄:如需重建底部,翻转物体继续拍摄
- 推荐方案:转盘 + 柔光箱 + 均匀照明,用 CaptureSample App 的定时快门同步转盘转动
Apple 提供了 CaptureSample App(SwiftUI 编写),演示如何在 iOS 上拍摄带深度和重力数据的高质量照片。支持手动和定时快门模式,画廊可快速检查照片质量。
核心启发
-
做一个电商商品的 3D 展示工具。用 iPhone 拍一圈商品照片,上传到 Mac 自动生成 Reduced 精度的 USDZ,嵌入网页 AR Quick Look。顾客用手机就能看 3D 商品。入口 API:
PhotogrammetrySession+.reduced。 -
做一个文物数字化存档系统。博物馆用单反拍摄文物,生成 Full 精度模型存档,同时输出 Medium 精度供线上展览。入口 API:
PhotogrammetrySession+ 多 detail level 同时请求。 -
做一个家具摆放 AR 应用。用户拍自家家具生成 3D 模型,然后在新房里用 AR 预览摆放效果。利用 iPhone 深度数据自动恢复真实尺寸。入口 API:
PhotogrammetrySession+ HEIC 深度数据。 -
做一个食品菜单 3D 化工具。餐厅拍菜品照片,几分钟生成 3D 模型,顾客扫码看旋转的 3D 菜品。入口 API:
PhotogrammetrySession+ARQuickLook。 -
做一个交互式模型精修工具。先请求 preview 模型,让用户在 UI 中调整裁剪框和旋转,确认后再生成 Full 精度输出。省去外部 3D 编辑软件。入口 API:
PhotogrammetrySession+.preview+geometry参数。
关联 Session
- AR Quick Look, meet Object Capture — 将 Object Capture 创建的 USDZ 模型用于 AR Quick Look 展示
- Create 3D Workflows with USD — USD 格式详解,适合需要 Raw 输出做后期处理的工作流
- Dive into RealityKit 2 — RealityKit 2 新特性,包括自定义着色器和动态纹理
- Explore Shaders in RealityKit 2 — 为 Object Capture 生成的模型添加自定义材质效果
评论
GitHub Issues · utterances