Discover area mode for Object Capture
System Frameworks 进阶 20m

探索 Object Capture 的区域模式

Discover area mode for Object Capture

2024年6月10日

在 Apple 官方观看视频

一句话判断

Object Capture 新增的区域模式让你可以扫描不规则地形、无法环绕的物体和 2.5D 表面,配合 Mac 端的 Quad Mesh 和 16K 纹理,产出质量直逼专业摄影测量软件。

这场 Session 讲了什么

Object Capture 在 iOS 17 只支持”物体模式”——你需要围绕一个可移动的物体走一圈来构建 3D 模型。今年新增的”区域模式”(Area Mode)打破了这条限制。你可以像用刷子一样扫描户外地形、岩石表面、或者任何无法 360 度环绕的场景。

API 层面的变化出奇地简单:跳过 startDetecting 调用,直接调用 startCapturing 就进入区域模式。加上 hideObjectReticle 修饰符隐藏边界框指示器,UI 就无缝切换到区域扫描体验。

Session 还介绍了 Mac 端处理的重大升级:新增 Quad Mesh 输出(适合后续建模和动画)、最高 16K 纹理、支持 2000 张图片输入、自定义掩码加载 API。这些能力让 Object Capture 从”轻量级扫描工具”变成了”可定制的工作流核心”。

值得深挖的点

区域模式的交互设计:把 3D 扫描变成”涂刷”

区域模式的 UI 交互用了一个很巧妙的隐喻——画笔。十字准星就是你的画笔,把它移过需要扫描的表面就是在”涂刷”细节。距离太近或太远时准星自动消失,这是一种无声的引导,比弹出提示框优雅得多。

拍摄时有触觉反馈、提示音和预览脉冲三重确认,确保你在户外嘈杂环境下也知道照片已经拍下。新的相机位姿可视化让你在现场就能检查覆盖情况,不用等回家处理完才发现漏了一个角度。

区域模式的设计取舍在于精度和范围。6 英尺以上的区域在 iPhone 端处理时网格和纹理质量会下降,需要在 Mac 上用更高的细节等级处理。如果你追求最高质量的户外场景重建,iPhone 端扫描 + Mac 端处理是推荐的组合。

新的数据加载 API:精细控制每张图片的元数据

今年的新 API 让你可以为每张图片提供自定义掩码,告诉重建引擎哪些像素是前景、哪些应该忽略。这在背景动态变化(比如有人手在物体前晃动)的场景下特别有用——你可以用位图掩码遮住手的部分,避免重建出伪影。

PhotogrammetrySample 的属性非常丰富:RGB 图像数据、深度图(恢复度量尺度)、重力向量(校正朝向)、元数据字典、对象掩码。新的加载 API 可以自动从图片文件中提取所有可用数据——JPEG 只能提取图片,但 Object Capture UI 拍摄的图片还能自动提取深度和重力信息。你只需要提供掩码,其他数据由系统填充。

这套 API 的设计思路是”渐进增强”:你只想加掩码?只提供掩码就行。系统会保留图片中原有的深度和重力数据,不需要你手动提取和回填。

代码片段

进入区域模式

// 区域模式:跳过 startDetecting,直接 startCapturing
let captureView = ObjectCaptureView()
    .hideObjectReticle  // 隐藏边界框指示器,UI 更干净

// 在合适的时候直接开始捕获,无需物体检测步骤
session.startCapturing()
// 自动进入区域模式体验

场景:扫描户外地形或无法环绕的大型表面。坑:区域模式对光线要求更严,阴天或完全遮蔽处效果最好,直射阳光会产生不均匀的阴影。

加载带掩码的 PhotogrammetrySample

// 新的加载 API:系统自动填充深度、重力等数据,你只需提供掩码
let sampleURL = imageURL  // Object Capture 拍摄的图片
let sample = try PhotogrammetrySample.load(from: sampleURL)

// 添加自定义掩码(遮住干扰的前景)
let maskSample = sample.withObjectMask(customMaskImage)

// 用带掩码的 sample 创建会话
let session = try PhotogrammetrySession(
    samples: [maskSample, /* 更多 sample */],
    configuration: configuration
)

场景:拍摄时有手或移动物体遮挡,需要用掩码排除干扰。坑:掩码必须是精确的黑白位图,灰度值不会被解释为部分遮挡。

Mac 端 Quad Mesh 输出配置

// 在 Mac 上处理时选择 Quad Mesh 输出
let configuration = PhotogrammetrySession.Configuration()
configuration.detail = .full  // 最高细节等级
configuration.outputOptions = [.mesh, .pointCloud]
// Quad mesh 适合后续在 Blender/Maya 中编辑 UV 和做动画
// 搭配 16K 纹理获得最佳视觉质量

场景:产出需要后期加工的 3D 模型,而不仅仅是展示用。坑:Quad Mesh 的处理时间比三角网格长很多,2000 张图片全质量处理可能需要数小时。

最佳实践

新项目: 如果你的 App 涉及 3D 扫描,直接支持区域模式。它不是物体模式的替代品,而是互补——物体模式适合桌面上的小物件,区域模式适合户外场景和大型表面。建议两种模式都在 UI 中提供入口。

已有项目: 如果你已经集成了 Object Capture 物体模式,添加区域模式只需要在跳过 startDetecting 的分支加一行代码。Mac 端的 Quad Mesh 和 16K 纹理是独立的功能,可以在后台工作流中集成,不影响移动端的扫描体验。

还有什么值得关注

  • 新的相机位姿可视化让你在拍摄现场就能确认覆盖完整度,减少”回家才发现漏拍”的尴尬。
  • Quad Mesh 的 edge loop 是对艺术家友好的拓扑结构,在 Blender/Maya 中编辑 UV 比三角网格方便很多。
  • 处理大量图片(最多 2000 张)需要 Mac 有足够的统一内存,内存不足时处理质量会下降。
WWDC 2024