大多数浏览器和
Developer App 均支持流媒体播放。
-
探索物体捕捉功能的区域模式
探索物体捕捉的区域模式可以如何扩展物体捕捉的功能,来支持区域的捕捉和重构,从而助你在 iOS 上开创全新的 3D 捕捉可能性。学习如何利用新的 macOS 示例 App 来优化 iOS 捕捉的质量以便重构,并探索如何使用 Apple Vision Pro、iPhone、iPad 或 Mac 上的“快速查看”功能来查看最终效果。了解 3D 重构方面的改进,包括一个用于创建自定图像处理管道的全新 API。
章节
- 0:00 - Introduction
- 2:41 - iOS API
- 4:24 - macOS sample
- 6:23 - Data Loading API
资源
相关视频
WWDC24
WWDC23
-
下载
大家好 我是 Zach 来自 Object Capture 团队 在本讲座中 我们将介绍 为了提高 3D 重构的 灵活性和质量而推出的许多更新 之前 我们介绍了 iOS 上的物体捕捉 它是一个引导式捕捉 UI 可完全在设备上重构 3D 模型 物体捕捉最适合捕捉 可控室内环境中的可移动物体 在这样的环境中 你有足够的空间 围着物体绕行并捕捉每个角度 例如 我们在捕捉这个花瓶时 将花瓶侧翻过来扫描底部 效果非常好 通过物体捕捉 你可以创建美观、完整的物体 不过 有些物体无法 通过边界框流轻松捕捉
因此 我们引入了区域模式
现在 你可以轻松捕捉 室外凹凸不平的地形、 无法完全绕行的物体 或 2.5D 曲面 使用区域模式创建的模型非常适合 在 Apple Vision Pro 上的 3D 环境或艺术项目中使用 让我们来看看它的实际应用 在外出探险时 能够从大自然中捕捉到 丰富的纹理和 3D 形态 真是令人惊叹 首先 打开示例 App 并选择“Area mode” 对准拍摄物体并轻点 “Start capture” 在拍摄图像时 你会感觉到轻触 听到提示音
并在捕捉预览中看到脉冲 务必留意周围环境并缓慢移动 以便捕捉到的图像相互重叠
瞄准器就像一支画笔 你可以让它在表面上移动 绘出所有细节 如果你瞄准的物体太近或太远 瞄准器就会消失 为了获得最佳效果 请尽量平行于 拍摄物体的每个表面进行捕捉
完成后 你可以使用新的 相机位姿可视化功能 检查捕捉图像的位置 以确保你在捕捉时 获取了所需的所有数据 最后 选择直接在 iPhone 上 创建 3D 模型的流程
这看起来已经非常不错了 但我稍后会向你展示 如何获得更好的质量
你可以下载这款 App 的 源代码并亲自尝试 也可以将它作为起点 来打造你自己的应用程序 区域模式为发挥创意 开启了新的可能性 让任何人都能打造 美轮美奂的 3D 场景
现在 我们已经在示例 App 中 观看了物体捕捉区域模式的相关演示 接下来让我们继续了解 今年推出的各项令人兴奋的新功能 首先 我将说明如何整合 物体捕捉的区域模式 然后我将介绍我们的 macOS 示例 App 它可实现更高质量的重构 最后 我将介绍我们的 新 Data Loading API 它具有更大的灵活性 可满足你的用例 让我们首先了解一下新的 iOS API
首先 我们将了解关于获得 最佳物体捕捉效果的 一些注意事项 在捕捉区域时 要以没有突兀阴影的 漫射光为指导原则 因此如果在户外 最好选择 阴天或完全遮蔽的区域 按一定的路线缓慢移动 这样可以拍摄到清晰的图像 并有足够的重叠特征 还可以尝试从不同高度多层次捕捉 这样就能看到拍摄物体的各个角度 大于 6 英尺的区域可能会 降低网格和纹理质量 除非在 Mac 上进行更精细的处理
物体捕捉已在 iPad Pro 2021、 iPhone 12 Pro 以及更新机型中推出 现在 让我们来看看如何在 App 中实现区域模式 去年 你需要调用 start 然后调用 startDetecting 才能开始检测物体并设置边界框 设置边界框后 将接着调用 startCapturing 以开始捕捉过程 对于区域模式 不需要设置新的调用或配置 实际上更加简单 可以跳过 startDetecting 调用 直接进行 startCapturing 调用即可 这将以新的 UI 启动 区域模式体验 如这里所示 由于区域模式下 没有边界框检测步骤 因此我们建议关闭物体瞄准框架 以便实现无缝过渡 这也有助于你预先知道 将进入哪种模式 让我们看看如何实现这一点 我只需将新的 hideObjectReticle 修饰符 添加到 ObjectCaptureView 以指示开始按钮将进入区域模式 现在 UI 正确指出已进入区域模式 我们将实现无缝过渡
就是这样!现在让我们看看 Mac 上的物体捕捉有哪些新功能 Mac 上的处理提供了 更多的选项和更高的质量 让你可以充分利用捕捉功能 我们的新示例 App 让你可以轻松上手 它的 UI 简单 可引导你 创建各种 3D 模型类型 首先 让我们选择用于保存 之前所捕捉图像的文件夹 我还将为它命名并选取 最终模型的存储位置
下面 我可以将模型 设置为三角形网格 或者今年新增的四边形网格 这种新的输出类型意味着 你的物体捕捉模型 可以在你选择的工具中 进行进一步的清理、 优化或制作动画
这是三角形网格 与四边形网格的对比 这使得编辑 UV 和为 3D 物体 制作动画变得更加简单 并且我们的算法能够创建 适当的边环 方便艺术家使用 除了四边形网格外 我们还增加了 设置自定义精细程度的功能 最高可设置 16k 纹理
这在大型场景中发挥了巨大作用 非常适合离线渲染用例 如 VFX
除了 16k 纹理 支持更多图像意味着 你能够以更高的质量 处理更大的区域 在带大容量统一内存的 Mac 机型上 你最多可以处理 2000 张图像
我会将这个选项设置为包括环境 并选择完整画质
现在我可以开始处理了
处理完成后 我将对在小径上 捕捉的另一个图像重复这些步骤 这些是经过我裁剪和 编辑后的成品模型 可以用于 Apple Vision Pro 如需了解详情 请查看 Scott 关于如何“为空间计算优化 3D 素材资源”的讲座
我在 Reality Composer Pro 中 又做了一些编辑并合并了素材资源 我觉得在 Apple Vision Pro 上的 QuickLook 中 效果看起来棒极了 这是一个有意义的纪念品 可以提醒我回到 自己喜欢的小径上漫步
现在让我们接着讨论 今年新增的数据加载功能
如果你无法控制捕捉背景 或者背景是动态变化的 则可以为每个图像提供一个遮罩 以指出哪些像素是前景 并且应该重构 哪些像素是背景并且不应重构 这样做很有帮助 在这个示例中 手是移动的 并且遮挡了火龙果的部分区域 这可能会导致自动分割出现伪影 在这种情况下我可以 通过添加遮罩来帮助进行重构
假设我为每个样本图像 都创建了位图遮罩以遮住手部 如何在重构时包含这些遮罩? PhotogrammetrySession 用于根据图像重构模型 有两个用于创建会话的输入源 图像文件夹或 PhotogrammetrySample 序列 对于自定义位图 我可以自行创建序列 来为样本添加遮罩以便用于重构 样本具有多个可提供的属性 最重要的是 RGB 图像数据 还有用于恢复度量尺度的深度图、 用于确定直立方向的重力向量、 包含额外信息的元数据字典 当然还有可选的物体遮罩 这正是我要提供的 不过 我仍然希望在样本中 保留所有其他数据 之前 你必须手动加载 所有这些数据 这相当复杂 今年我们为 PhotogrammetrySample 引入了新的加载 API 它能获取要加载的图像文件 并填入图像提供的 所有数据属性 从而简化了操作 对于来自 DSLR 的 JPEG 可能只加载图像 但对于来自物体捕捉 UI 的图像 还将加载深度数据和重力数据 请注意 我们提供了 同步和异步两种版本 我们提供异步版本以供 需要这一版本的用例使用 例如 SwiftUI 中的检查器 不过 PhotogrammetrySession 需要同步版本 你将会看到这一点
在这里 我创建了一个简单的函数 它利用图像 URL 并返回一个 PhotogrammetrySample 其中包含这个图像中的数据 以及已加载并附加到样本的 物体遮罩 在这里 你可以看到调用了新的 API 我只需尝试使用新的 同步构造器来加载图像文件 如果成功 我就会得到一个 PhotogrammetrySample 它填充了图像中的所有数据
接下来 假设我有一个辅助函数 它将加载我为每个 图像文件提前创建的 已存储物体遮罩 我将加载遮罩并把它分配给 objectMask 属性
完成后 我将返回样本 最后 我要说明的是 如果加载过程中出现任何问题 并引发错误 会直接返回 nil 稍后我将演示如何处理这种情况
现在我可以加载样本 并添加自定义遮罩 我需要将这些样本放入序列中 以创建自定义 PhotogrammetrySession
假设我获得了一个 URL 数组 这些 URL 指向要在重构中 使用的所有图像 我只需将新的 loadSampleAndMask 函数映射到这个数组 从而创建一个惰性序列 作为会话的输入 这里有几点需要指出 首先 务必将数组设为惰性数组 这样就不会一次性 将所有图像加载到内存中 这意味着会话将在遍历序列时 一次加载一个图像 其次 在这里我使用 compactMap 而不是 map compactMap 会直接忽略 所有空元素 如果我无法加载文件 就会出现这种情况 现在 我只需返回一个 使用序列作为输入的会话 然后像往常一样处理重构请求即可 就是这样! 最终的重构效果看起来很棒 而且我成功避免了 手遮挡物体造成的任何伪影 之前 你需要数百行复杂的代码 来加载深度图和其他数据 但有了 PhotogrammetrySample 的 新构造器 现在只需几行代码就能完成 除了加载现有的数据属性外 我们还提供了几个新的只读属性 让你能加载 由 ObjectCaptureSession 捕捉 UI 存储的数据 这些属性在检查器 UI 或自定义重构管道中可能非常有用 你可以参考相关文档 了解关于每个属性的更多详情 我只想重点介绍 一个重要的新增属性 即 拍摄时的相机数据 如果你有兴趣使用这些数据 自行创建后端重构管道 或者为数据捕捉 提供更高级的可视化 那么使用 ObjectCaptureSession 捕捉的图像将包含拍摄时的 相机变换信息 以供各个样本使用 如果可以 我们还会提供自定义管道 可能需要的内参矩阵 和所有可用的校准数据 我认为 Data Loading API 不仅为创建 PhotogrammetrySession 提供了更大的灵活性 还将为新的可视化 和自定义管道带来许多可能性
有关物体捕捉的介绍到此结束 我们探索了在 iOS 上捕捉区域、 使用 Mac 上提供的 所有选项进行处理 以及在 Apple Vision Pro 上查看 请观看这些讲座 进一步了解物体捕捉 和 3D 模型优化 我已经迫不及待想要看到 你们的创作了
-
-
8:19 - Data Loading API - load Sample and Mask
func loadSampleAndMask(file: URL) -> PhotogrammetrySample? { do { var sample = try PhotogrammetrySample(contentsOf: file) sample.objectMask = try loadObjectMask(for: file) return sample } catch { return nil } }
-
9:15 - Data Loading API - create custom photogrammetry Session
func createCustomPhotogrammetrySession(for images: [URL]) -> PhotogrammetrySession { let inputSequence = images.lazy.compactMap { file in return loadSampleAndMask(file: file) } return PhotogrammetrySession(input: inputSequence) }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。