ARKit hitTest(_:options:) 到 select 放置的 3d 对象不工作

ARKit hitTest(_:options:) to select placed 3d-objects not working

我正在尝试 select 一个已放置在检测到的平面上的对象,以便对其执行各种任务,例如通过手势旋转。

为了搜索放置的对象并避免获得无关性质的 hitTestResults(例如 select 飞机或 ARWorldMap 本身)我正在尝试将 hitTest(_:options:) 与 SCNHitTestOption.categoryBitMask。然而,它似乎是所有类型的 hitTest returns 结果,而不仅仅是具有 selected categoryBitMask = 5 的对象,即使根据我的理解 categoryBitMask 是 "An option to search only for objects matching a specified bitmask." 如何解决这个问题,有没有更好的方法 select 在 ARKit 中放置 3D 模型?下面是我必须旋转 3d 模型的功能。

enum BodyType: Int {
    case model = 5
}

@objc func panned(recognizer :UIPanGestureRecognizer) {
    guard let recognizerView = recognizer.view as? ARSCNView else {return}

    let touch = recognizer.location(in: recognizerView)
    let translation = recognizer.translation(in: recognizerView)

    let hitTestResult = self.sceneView.hitTest(touch, options: [SCNHitTestOption.categoryBitMask: BodyType.model.rawValue])
    guard let modelNodeHit = hitTestResult.first?.node.parent else{return}
    if recognizer.state == .changed {
            self.newAngleY = Float(translation.x) * (Float) (Double.pi) / 180
            self.newAngleY += self.currentAngleY
            modelNodeHit.eulerAngles.y = self.newAngleY
    }else if recognizer.state == .ended {
        self.currentAngleY = self.newAngleY
    }
}

is there a better way to select placed 3D-models in ARKit

不,你是对的。搜索 SceneKit 内容时使用 SCNSceneRenderer.hitTest(_:, options:),搜索 ARKit 识别的真实对象时使用 ARSCNView.hitTest(_:types:)

这里似乎有问题的是 categoryBitMask 是一个位掩码。 5 的二进制表示形式为 101。然后,SceneKit 将每一位与对象上的位进行比较,如果 任何 匹配,它就会在结果中包含该对象。
因此,当所有其他对象都具有默认类别 1 时,它会包含在结果中,因为 101001 具有匹配位。

您可以使用的是 OptionSet 协议。

struct BodyType: OptionSet {
  let rawValue: Int

  static let `default` = BodyType(rawValue: 1)
  static let userInteraction = BodyType(rawValue: 4)

  static let model: BodyType = [.default, .userInteraction]
}

您的模型获得 model 选项,但在您的命中测试中您只使用 .userInteraction.