ARKit 相关问题集锦

搬运自 Ask Apple-2022-12-13

关于 ARKit 今年新增功能,各位可以查看以下文档和视频:

4 个赞

我应该如何将扫描生成的 3D 模型(网格+纹理)保存为 usdz/obj/usdc 格式?

您需要自己编写函数实现这个功能。导出到 .obj 相对简单一些,因为它是一种非常简单的基于文本的格式:https://en.wikipedia.org/wiki/Wavefront_.obj_file
此外,如果您使用的是 SceneKit,则可以使用 write(to:options:delegate:progressHandler:) 选项导出 usdz 文件。

2 个赞

如何根据 RealityKit 前置摄像头中检测到的面部移动来控制 3D 角色面部?我感觉有可能通过播放关节动画来实现,但没有找到相关的示例代码以及文档。

RealityKit 目前不支持 BlendShapes。 您可以尝试在 CustomMaterial 的 geometryModifier 里实现自己的逻辑。但是,如果您可以使用关节而不是 blend shapes 来创建角色,那么您可以在 RealityKit 中通过修改每帧的 ModelEntity.jointTransforms 来为其设置动画。

1 个赞

我在 App 里使用 ARKit 的时候,需要经常启动和停止 ARSession。但当停止后重新启动 ARSession,进入 normal 状态会比一开始启动 ARSession 要慢很多。如何能加快重新启动 ARSession 的速度?

您可能指的是 ARKit 的重定位行为。当 ARKit 恢复已有 session 的时候,默认情况下会花5秒钟的时间来尝试重新定位到停止前的位置。在这期间,tracking 状态会是 .limited 并且原因是 .relocalizing。您可以通过 sessionShouldAttemptRelocalization 返回 false 来跳过重定位:Apple Developer Documentation

2 个赞

我想使用 ARKit 搭建基于某个位置的 AR 体验,比如在商场里放置一些 AR 物体,让用户到这里之后可以查看。我查阅了API 文档之后,发现 ARWorldMap 是很好的选择。但实际情况下使用 ARWorldMap 非常困难,特别是在大型室内环境,往往需要很长的时间来重定位,并且 world map 文件也很大,通常需要 20-40 MB 大小。请问对于这样的场景下是否可以使用 ARKit?

可以尝试拆分为多个较小的 ARWorldMap 文件,结合其它的定位机制来决定加载哪个 world map。另外,也可以尝试使用 image tracking,比如对于某些海报或者标记,然后相对于 ARImageAnchor 来锚定虚拟内容。

1 个赞

我的 App 提供了一个功能,让用户可以在墙上以 AR 的方式看到艺术品。但是,如果墙壁是纯白并且平整的,ARKit 会很难放置图像。有什么办法可以改善吗?

在带有 LiDAR 传感器的设备上(例如 iPhone 12/13/14 Pro 型号)应该问题不大。但在没有激光雷达传感器的设备上,ARKit 会依赖于从不同角度检测视觉特征来识别平面,因此纯白的墙壁会很有挑战。这种情况下,您也许可以引导用户将艺术品放置在已经有艺术品的墙上,检测到墙壁的几率会变高。

我正在开发一个 App,能为物体拍照并且提供物体的 3D 尺寸。激光雷达传感器可以帮助我们实现这个功能吗?

在有 LiDAR 传感器的设备上,您可以开启 ARSceneReconstructionMesh 选项,这样就可以获取到 ARMeshAnchor 也就是物体的 3D 网格。关于如何获取网格数据可以查看这个示例代码

1 个赞

我们正在尝试使用 RealityKit 向 AR 对象添加自定义着色器。 有没有办法在用户输入时触发自定义着色器动画? 比如当用户点击一个 AR 对象时,自定义着色器会导致该对象逐渐消失并变得不可见?

您可以将输入更改为每帧的 CustomMaterial 以对其进行动画处理,包括不透明度。 需要确保将 material 设置回 ModelComponent,并将 component 设置回 Entity,因为 component 和 material 是值类型,而不是引用类型。

1 个赞

是否可以在同一个 ARSession 中运行多个 AR 配置?比如同时识别并跟踪用户面部、身体、手部以及周围墙壁,并添加 AR 体验。

ARSession 一次只能运行一个 AR 配置。但这里有的能力是可以一起使用的,比如配置为 ARBodyTrackingConfiguration 的时候也可以进行平面检测,所以也能检测到墙壁。面部跟踪仅适用于前置摄像头。ARKit 不支持手部识别,可以使用 Vision 来识别手部。Vision 是可以和 ARKit 共同使用的。

1 个赞

我在使用 captureHighResolutionFrame API 来拍摄最佳图像,不过对于某些物体比如管道,图像的景深不够大,是否有办法在使用 ARKit 期间增加景深效果?

可以尝试使用新的 configurableCaptureDeviceForPrimaryCamera API 获取 AVCaptureDevice,以便调节相机参数,包括焦点。(在 iOS 16 中,您还可以选择 4K 视频格式。)

1 个赞

我在使用“Creating a Collaborative Session”示例代码,并在此基础上修改以实现多人同步的 AR 体验。我发现场景里的 3D 内容无法很好的同步,比如在一台设备上删除了一个 3D 物体,另一台设备上并没有删除。这是 ARSession.CollaborationData 的限制还是我做错了什么?

ARKit 协作数据纯粹是为了让两台设备上的 ARKit 就共享坐标系达成一致。对于 3D 内容的同步,是需要您在 App 里实现对应的业务逻辑。ARKit 并不知道您的 3D 内容,因此也不知道需要同步哪些内容。如果您使用的是 RealityKit 做渲染,可以使用 RealityKit 提供的同步服务。比如可以看看这篇文章

1 个赞

ARKit 中有现成的方法计算 2个 SIMD3 之间旋转角度值吗

可以使用点乘,具体可查看 Apple Developer Documentation

1 个赞

在 Apple 的 Measure app 里,当把相机对准一个人时,app 会显示这个人的身高。我们怎样才能实现类似的功能?

您可以尝试实现这个功能,利用 ARKit 的 person segmentation 以及 body tracking。body tracking 可以查看这个示例代码,以及人像分割可以查看这个示例代码。请注意当使用 body tracking 的时候,我们还提供了估算的比例因子:estimatedScaleFactor

1 个赞

有没有办法动态加载 .arobject 文件作为物体检测的参考?似乎只适用于在编译时添加在 bundle 里的文件。

您可以在运行时使用 init(archiveURL:) 实例化 ARReferenceObject:Apple Developer Documentation

1 个赞