大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 RoomPlan 创建参数 3D 空间扫描
RoomPlan 可以帮助您的 App 快速为空间创建简易版参数 3D 扫描。了解如何利用此 API 轻松添加空间扫描体验。我们还将介绍如何采用此 API,探索 3D 参数输出,并分享最佳实践以帮助您在每次扫描时得到理想的结果。
资源
相关视频
WWDC23
Tech Talks
WWDC22
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ Praveen Sharma:大家好 我叫 Praveen 我来自 Apple 的原型设计团队 Kai Kang:大家好 我叫 Kai 我来自视频工程团队 Praveen:在过去的几年里 Apple 带来了 一些有效而新颖的方式 帮助人们使用 App 描绘世界 去年 我们推出了 Object Capture 它拍摄真实世界物体的照片 并使用 RealityKit 中的 Photogrammetry API 将照片变成可 在 App 中使用的 3D 模型 在 Object Capture 之前 我们发布了 Scene Reconstruction API 它帮助您粗略地理解 您空间的几何结构 并支持您的 App 中的 全新增强现实用例 今年 我们很高兴地宣布推出 一个名为 RoomPlan 的全新框架 在 RoomPlan 中 您可以使用 支持 LiDAR 的 iPhone 或 iPad 扫描房间 它可以生成 房间的参数化 3D 模型 以及您可以 在 App 中使用的房间定义物品 让我们来了解一下 RoomPlan 的扫描体验 RoomPlan 使用 由 ARKit 提供支持的 复杂的机器学习算法 用于检测墙壁、窗户 开口和门以及房间定义物品 比如壁炉、沙发、桌子和橱柜 我们的 RoomCaptureView API 使用 RealityKit 实时呈现扫描进度 让您可以轻松将扫描体验 集成到您的 App 中 完成扫描后 RoomCaptureView 呈现最终的处理后结果 供您以最适合您的用例的方式使用 这是我们首次剔除了复杂的实施过程 机器学习和计算机视觉算法 人们现在可以 以全新的方式与房间交互 例如您可通过室内设计 App 预览墙壁颜色变化 它还可准确计算 重新粉刷房间所需的油漆量 通过建筑 App 人们现在可以轻松地预览 并实时编辑对其房间布局的更改 房地产 App 现在可以让代理商 无缝地获得 房源的平面图和 3D 模型 电子商务 App 可以展示实际空间中的物品 从而吸引顾客 这些只是 RoomPlan 的几个 App 示例 您会惊讶地发现 将 RoomPlan 集成到 App 中是多么简单 让我们来讲解一下 您可以通过两种 主要方式使用 RoomPlan 首先是我们的开箱即用扫描体验 它允许您将 RoomPlan 无缝集成到您的 App 中 第二个是我们的数据 API 它支持您的 App 以最适合您的用例的方式 使用实时参数数据 我们会基于两个 API 推荐一些最佳实践 以帮助您获得最佳的扫描结果 我们将在这次演讲的最后一部分介绍 首先说一下可用 新 RoomCaptureView API 集成到 App 中的扫描体验 房间捕获视图是 UI 视图的子类 您可以轻松地 将其集成到 App 中 它处理世界空间扫描反馈的呈现 实时房间模型生成 以及辅导和用户指导 让我们仔细了解一下在 RoomCaptureView 扫描期间呈现的设计元素 在有效 RoomCaptureView 会话期间 它会用动画线条勾勒出 检测到的墙壁、窗户、开口 门和实时定义房间物品 会在 RoomCaptureView 的底部 实时生成交互式 3D 模型 让您一目了然地了解扫描进度 最后文字辅导让您可以 获得最佳扫描结果 让我们看看如何开始使用 RoomCaptureView 只需四个简单的步骤即可 首先 我们在 ViewController 中 创建一个 RoomCaptureView 第二 我们创建一个 RoomCaptureSession 的配置对象引用 第三 我们开始扫描会话 将我们的配置传递给 捕获会话的运行函数 最后我们的 App 会告诉捕获会话 停止扫描 或者您的 App 可以遵守我们的 RoomCaptureViewDelegate 并选择退出后处理结果 和其显示 或在显示后 后处理扫描结果 例如您可以调用所提供的 CapturedRoom 数据结构上的可用的导出函数 以导出一个 USDZ 结果 这就是将 RoomPlan 集成到您的 App 中的简单方法 我们期待着 您能用这个 API 完成更多任务 现在我的同事 Kai 将为您介绍 RoomCaptureSession 和 Room Plan 的 Data API Kai:谢谢您 Praveen 在本部分中 我们将带大家了解 Data API 它为您提供在扫描期间 访问底层数据结构的权限 可以从头到尾帮助您建立自定义 的可视化扫描体验 基本工作流程由三部分组成 即扫描、处理和导出 对于扫描 我们将介绍如何设置 并开始捕获会话以及 显示和监控捕获过程基础知识 然后我们将介绍 扫描数据是如何处理的 以及如何收到最终模型以进行展示 最后我们将讨论如何生成和导出 输出 USD 文件 您也可以在 USD 工作流程中使用它 现在 让我们详细研究一下扫描步骤 在我们扫描时 我们将使用 RoomCaptureSession API 设置会话并显示进度 我来给您看下代码 这是一个简单的 RealityKit App 示例 首先您只需将 RoomPlan 导入 Swift 项目中 在您的 App 的 ViewController 中 您可以用自定义类型来显示结果 并启动 RoomCaptureSession 实例 此外 RoomCaptureSession 提供了一个 到底层 AR 会话的句柄 这样 App 就可以 在 AR 视图中 绘制平面和对象边界框 RoomCaptureSession 采用委托模式 在您的 ViewController 类中 您可以将 ViewController 本身 指定为 captureSession 的代表 这将允许 ViewController 从 RoomCaptureSession 中获取实时更新 这些更新包括 3D 模型和说明 以引导大家完成捕获流程 要获得这些更新 您的 ViewController 需要符合 RoomCaptureSessionDelegate 委托协议 并实施两种方法 第一个是 captureSession(_ session: didUpdate room:) 方法 这是为了得到实时的 CapturedRoom 的数据结构 您的可视化工具可以使用它 来更新 3D 模型的 AR 视图 向人们提供关于 进展的实时反馈 我们将在此次谈话的后面部分 深入研究捕获到的 CapturedRoom 当我们检测到 CapturedRoom 的更新时 我们将调用此方法 第二种方法是 captureSession(_ session: didProvide instruction:) 此方法为您提供指令结构 其中包含实时反馈 您的可视化工具可以使用该指令 在扫描过程中引导人们 让我们看一下此 API 提供的指令 这些指令包括到物品的距离 扫描速度 房间照明调节 以及专注于房间中 有更多纹理的特定区域 将在扫描期间提供这些指令 以用实时反馈指导人们 接下来 我们将进入流程部分 在本部分中 我们将使用 RoomBuilder 类 处理扫描到的数据 并生成最终的 3D 模型 要处理捕获到的数据 第一步是启动 ViewController 类中的 RoomBuilder 实例 接下来 为了接收传感器数据 在捕获过程之后 您的 App 需要实施 captureSession(_ session: didEndWith data: error:) 方法 当通过调用 App 中的 stop() 函数 或由于错误而停止 RoomCaptureSession 时 将调用此函数 以返回捕获房间数据对象 和一个可选的错误 最后 为了处理捕获到的数据 我们使用等待关键字 调用 roomBuilder 异步 roomModel(from:) 方法 该方法异步运行 以处理扫描的数据 并构建最终的 3D 模型 它利用了 Swift async/await 函数 我们在去年的 WWDC 中介绍过 在短短几秒钟内 该模型将可在 您的 App 程序中进行最终展示 现在 让我们深入了解一下 捕获到的房间数据结构的细节 以及如何将其导出 以在您的 App 中使用 在顶层有 CapturedRoom 它由表面和对象组成 表面包含代表曲线的独特属性 如半径、起始角和终止角 曲面的四个不同边缘 以及墙、洞口、窗户、门的建筑类别 对象包含家具类别 如桌子、床、沙发等 表面和对象有一些 关于扫描的表面或物体 的共同的属性 例如尺寸 以及三个级别的置信度 3D 变换矩阵以及唯一标识符 让我们看看 它们在代码中是如何表示的 捕获到的房间结构是房间内元素 的完全参数化表示 它包含五个属性 包括房间里的墙壁 开口、门、窗和物品 对于前四个元素 它们表示为表面结构 代表二维平面建筑结构 在右侧 您可以看到各种 我们之前介绍过的表面属性 最后一个属性 是房间中的 3D 物品数组 它们以立方体的模式呈现 在右侧 您可以看到物品的各种属性 这是我们在 RoomPlan 中 支持的物品类型列表 其中包括各种常见的家具类型 例如沙发、桌子、椅子、床等 最后 导出功能允许您将此 捕获到的房间导出为适用于 您的现有工作流程 USD 或 USDZ 数据 此示例显示了 如何在 Cinema 4D 中 直接打开 USD 输出 以浏览和编辑房间的分层数据结构 以及每个房间元素 或物品的尺寸和位置 您还可以利用现有 USD 和 USDZ 工作流程 将捕获到的房间的 渲染图用于各种 App 例如房地产、电子商务 公用事业和室内设计 到目前为止 我们介绍了扫描体验 和底层的 RoomPlan API 现在我们将介绍一些最佳实践 以帮助您用 RoomPlan 获得理想效果 我们将介绍 优质扫描的理想环境 选择房间时要注意的房间功能 以及一些要牢记的 扫描和散热方面的注意事项 RoomPlan API 支持最常见的建筑结构 和典型家庭中的物品 它最适合单个住宅房间 最大房间大小为 30 英尺乘 30 英尺 即大约 9 米乘 9 米 照明对于 API 来说也很重要 这有助于确保清晰的视频流 和良好的 AR 跟踪性能 使用 API 时建议亮度 至少 50 勒克斯或更高 家庭客厅在夜间的亮度 通常就是 50 勒克斯 硬件方面 RoomPlan API 支持所有 支持 LiDAR 的 iPhone 和 iPad Pro 机型 有一些可能会给 API 带来挑战的特殊情况 例如全高镜子和玻璃会让 LiDAR 传感器难以产生预期的输出 较高的天花板也可能超出 LiDAR 传感器的扫描范围限制 此外 设备可能 难以扫描非常昏暗的表面 注意这些问题 有助于获得更好的扫描结果 第一 对于精度要求高的 App 在扫描前准备好房间 可以提高扫描质量 比如拉开窗帘 可以让更多的自然光 进入并减少窗户遮挡 在白天扫描时最适合这样做 关门可以避免 意外扫描到房间外的区域 良好的扫描动作对于用 API 获得良好的扫描结果而言也同样重要 这就是为什么 我们提供用户指令委托方法 以在扫描期间给人们 提供关于纹理、距离 速度以及扫描期间的反馈 您还需要注意 设备的电池和热量 我们对 RoomPlan API 做了很多优化 以确保良好的扫描体验 不过 最好避免重复扫描 或超过 5 分钟的单次长扫描 这些不仅会导致疲劳 还会耗尽电池并导致散热问题 反之可能会影响 您的 App 的用户体验 我们今天介绍了很多内容 我们介绍了 全新的 API RoomPlan 它提供直观的扫描体验 以捕获您的房间 还有强大的机器学习模型来理解环境 以及完全参数化的 USD 输出格式 以轻松集成到您的 App 中 有关如何更好地设计和 提供 RoomPlan 体验的指南 请查看下面的相关讨论 Praveen:是时候在您的 App 中 试用 RoomPlan 了 我们迫不及待地想看看您可以用 这个新 API 创建哪些精彩内容 Kai:谢谢收看! ♪
-
-
4:36 - RoomCaptureView API - Scan & Process
// RoomCaptureView API - Scan & Process import UIKit import RoomPlan class RoomCaptureViewController: UIViewController { var roomCaptureView: RoomCaptureView var captureSessionConfig: RoomCaptureSession.Configuration private func startSession() { roomCaptureView?.captureSession.run(configuration: captureSessionConfig) } private func stopSession() { roomCaptureView?.captureSession.stop() } }
-
5:00 - RoomCaptureView API - Export
// RoomCaptureView API - Export import UIKit import RoomPlan class RoomCaptureViewController: UIViewController { … func captureView(shouldPresent roomDataForProcessing: CapturedRoomData, error: Error?) -> Bool { // Optionally opt out of post processed scan results. return false } func captureView(didPresent processedResult: CapturedRoom, error: Error?) { // Handle final, post processed results and optional error. // Export processedResults … try processedResult.export(to: destinationURL) … } }
-
6:50 - RoomCaptureSession - setup previewVisualizer
import UIKit import RealityKit import RoomPlan import ARKit class ViewController: UIViewController { @IBOutlet weak var arView: ARView! var previewVisualizer: Visualizer! lazy var captureSession: RoomCaptureSession = { let captureSession = RoomCaptureSession() arView.session = captureSession.arSession return captureSession }() override func viewDidLoad() { super.viewDidLoad() captureSession.delegate = self // set up previewVisualizer } }
-
7:40 - RoomCaptureSession - live results and user instructions
// Getting live results and user instructions extension ViewController: RoomCaptureSessionDelegate { func captureSession(_ session: RoomCaptureSession, didUpdate room: CapturedRoom) { previewVisualizer.update(model: room) } func captureSession(_ session: RoomCaptureSession, didProvide instruction: Instruction) { previewVisualizer.provide(instruction) } }
-
9:12 - Setup RoomBuilder
// RoomBuilder import UIKit import RealityKit import RoomPlan import ARKit class ViewController: UIViewController { @IBOutlet weak var arView: ARView! var previewVisualizer: Visualizer! // set up RoomBuilder var roomBuilder = RoomBuilder(options: [.beautifyObjects]) }
-
9:30 - RoomBuilder - generate final 3D CapturedRoom
// RoomBuilder with the latest CapturedRoomData to generate final 3D CapturedRoom extension ViewController: RoomCaptureSessionDelegate { func captureSession(_ session: RoomCaptureSession, didEndWith data: CapturedRoomData, error: Error?) { if let error = error { print("Error: \(error)") } Task { let finalRoom = try! await roomBuilder.capturedRoom(from: data) previewVisualizer.update(model: finalRoom) } } }
-
11:20 - CapturedRoom and export
// CapturedRoom and export public struct CapturedRoom: Codable, Sendable { public let walls: [Surface] public let doors: [Surface] public let windows: [Surface] public let openings: [Surface] public let objects: [Object] public func export(to url: URL) throws // Surface definitions ... // Object definitions ... }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。