删除 Ios ar 对象的触摸手势(旋转/平移)

Nee*_*101 3 augmented-reality ios arkit swiftui realitykit

摘要:添加 AR 对象后删除其上的触摸手势?

AR 查看代码(仅相关位)。其中 arObject 是具有网格、材质和碰撞形状的模型实体。

func updateUIView(_ uiView: ARView, context: Context) {
  arObject = CreateCustomModelEntity()
  uiView.installGestures([.translation, .rotation], for: arObject)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以向我的 arObject 添加触摸手势,并允许它在锚定平面上旋转和移动。

但是,我想在添加后删除触摸手势。

用户流程:

用户可以单击一个模型,将其移动并将其放置在他们想要的位置,然后触摸“确认”按钮。触摸确认按钮后,arObject 将无法再移动。

查看Apple文档,有一个installGestures,但没有等效的removeGestures。这可能吗?

一些想法,

  1. 完全删除锚点并重新创建它(但是对象的位置会丢失,所以这很糟糕)
  2. 使用新的子 ar 对象覆盖现有的子 ar 对象,而不安装触摸手势。我相信这会保留对象放置,但双重创建 ar 对象并不理想,除非没有其他解决方案。
  3. 使用安装手势创建一个临时 ar 对象,然后在确认放置后使用新的 arObject(无触摸手势)覆盖它。与2.解决方案类似。

小智 6

installGestures 方法返回 EntityGestureRecognizers 数组,并将这些gesturesRecognizers 分配给 arView.gesturesRecognizers 数组。如果您想删除给定实体的手势,您需要找到所需的gesturesRecognizers并将其从该数组中删除。

下面的代码将平移和旋转gestureRecognizers分别分配给一个属性,您可以使用该属性在arView.gesturesRecognizers数组中查找相应的索引。

func updateUIView(_ uiView: ARView, context: Context) {
    arObject = CreateCustomModelEntity()
    translationGestureRecognizer = uiView.installGestures([.translation], for: arObject).first
    rotationGestureRecognizer = uiView.installGestures([.rotation], for: arObject).first
}

func removeGesture() {
    let recognizerIndex = arView.gestureRecognizers?.firstIndex(of: translationGestureRecognizer!)
    arView.gestureRecognizers?.remove(at: recognizerIndex!)
}

    
Run Code Online (Sandbox Code Playgroud)

我发现从场景中删除对象时也必须从 arView 中删除gestureRecognizers,否则它不会从内存中释放,从而增加应用程序的占用空间。