搬运自 Ask Apple-2022-12-13
关于 ARKit 今年新增功能,各位可以查看以下文档和视频:
搬运自 Ask Apple-2022-12-13
关于 ARKit 今年新增功能,各位可以查看以下文档和视频:
我应该如何将扫描生成的 3D 模型(网格+纹理)保存为 usdz/obj/usdc 格式?
您需要自己编写函数实现这个功能。导出到 .obj 相对简单一些,因为它是一种非常简单的基于文本的格式:https://en.wikipedia.org/wiki/Wavefront_.obj_file
此外,如果您使用的是 SceneKit,则可以使用 write(to:options:delegate:progressHandler:) 选项导出 usdz 文件。
如何根据 RealityKit 前置摄像头中检测到的面部移动来控制 3D 角色面部?我感觉有可能通过播放关节动画来实现,但没有找到相关的示例代码以及文档。
RealityKit 目前不支持 BlendShapes。 您可以尝试在 CustomMaterial 的 geometryModifier 里实现自己的逻辑。但是,如果您可以使用关节而不是 blend shapes 来创建角色,那么您可以在 RealityKit 中通过修改每帧的 ModelEntity.jointTransforms 来为其设置动画。
我在 App 里使用 ARKit 的时候,需要经常启动和停止 ARSession。但当停止后重新启动 ARSession,进入 normal 状态会比一开始启动 ARSession 要慢很多。如何能加快重新启动 ARSession 的速度?
您可能指的是 ARKit 的重定位行为。当 ARKit 恢复已有 session 的时候,默认情况下会花5秒钟的时间来尝试重新定位到停止前的位置。在这期间,tracking 状态会是 .limited 并且原因是 .relocalizing。您可以通过 sessionShouldAttemptRelocalization
返回 false 来跳过重定位:Apple Developer Documentation
我想使用 ARKit 搭建基于某个位置的 AR 体验,比如在商场里放置一些 AR 物体,让用户到这里之后可以查看。我查阅了API 文档之后,发现
ARWorldMap
是很好的选择。但实际情况下使用ARWorldMap
非常困难,特别是在大型室内环境,往往需要很长的时间来重定位,并且 world map 文件也很大,通常需要 20-40 MB 大小。请问对于这样的场景下是否可以使用 ARKit?
可以尝试拆分为多个较小的 ARWorldMap 文件,结合其它的定位机制来决定加载哪个 world map。另外,也可以尝试使用 image tracking,比如对于某些海报或者标记,然后相对于 ARImageAnchor
来锚定虚拟内容。
我的 App 提供了一个功能,让用户可以在墙上以 AR 的方式看到艺术品。但是,如果墙壁是纯白并且平整的,ARKit 会很难放置图像。有什么办法可以改善吗?
在带有 LiDAR 传感器的设备上(例如 iPhone 12/13/14 Pro 型号)应该问题不大。但在没有激光雷达传感器的设备上,ARKit 会依赖于从不同角度检测视觉特征来识别平面,因此纯白的墙壁会很有挑战。这种情况下,您也许可以引导用户将艺术品放置在已经有艺术品的墙上,检测到墙壁的几率会变高。
我正在开发一个 App,能为物体拍照并且提供物体的 3D 尺寸。激光雷达传感器可以帮助我们实现这个功能吗?
在有 LiDAR 传感器的设备上,您可以开启 ARSceneReconstructionMesh
选项,这样就可以获取到 ARMeshAnchor
也就是物体的 3D 网格。关于如何获取网格数据可以查看这个示例代码。
我们正在尝试使用 RealityKit 向 AR 对象添加自定义着色器。 有没有办法在用户输入时触发自定义着色器动画? 比如当用户点击一个 AR 对象时,自定义着色器会导致该对象逐渐消失并变得不可见?
您可以将输入更改为每帧的 CustomMaterial 以对其进行动画处理,包括不透明度。 需要确保将 material 设置回 ModelComponent,并将 component 设置回 Entity,因为 component 和 material 是值类型,而不是引用类型。
是否可以在同一个 ARSession 中运行多个 AR 配置?比如同时识别并跟踪用户面部、身体、手部以及周围墙壁,并添加 AR 体验。
ARSession 一次只能运行一个 AR 配置。但这里有的能力是可以一起使用的,比如配置为 ARBodyTrackingConfiguration
的时候也可以进行平面检测,所以也能检测到墙壁。面部跟踪仅适用于前置摄像头。ARKit 不支持手部识别,可以使用 Vision 来识别手部。Vision 是可以和 ARKit 共同使用的。
我在使用
captureHighResolutionFrame
API 来拍摄最佳图像,不过对于某些物体比如管道,图像的景深不够大,是否有办法在使用 ARKit 期间增加景深效果?
可以尝试使用新的 configurableCaptureDeviceForPrimaryCamera
API 获取 AVCaptureDevice
,以便调节相机参数,包括焦点。(在 iOS 16 中,您还可以选择 4K 视频格式。)
我在使用“Creating a Collaborative Session”示例代码,并在此基础上修改以实现多人同步的 AR 体验。我发现场景里的 3D 内容无法很好的同步,比如在一台设备上删除了一个 3D 物体,另一台设备上并没有删除。这是 ARSession.CollaborationData 的限制还是我做错了什么?
ARKit 协作数据纯粹是为了让两台设备上的 ARKit 就共享坐标系达成一致。对于 3D 内容的同步,是需要您在 App 里实现对应的业务逻辑。ARKit 并不知道您的 3D 内容,因此也不知道需要同步哪些内容。如果您使用的是 RealityKit 做渲染,可以使用 RealityKit 提供的同步服务。比如可以看看这篇文章
在 Apple 的 Measure app 里,当把相机对准一个人时,app 会显示这个人的身高。我们怎样才能实现类似的功能?
您可以尝试实现这个功能,利用 ARKit 的 person segmentation 以及 body tracking。body tracking 可以查看这个示例代码,以及人像分割可以查看这个示例代码。请注意当使用 body tracking 的时候,我们还提供了估算的比例因子:estimatedScaleFactor
有没有办法动态加载 .arobject 文件作为物体检测的参考?似乎只适用于在编译时添加在 bundle 里的文件。
您可以在运行时使用 init(archiveURL:) 实例化 ARReferenceObject:Apple Developer Documentation