【问题标题】:ARKit hitTest(_:options:) to select placed 3d-objects not workingARKit hitTest(_:options:) 选择放置的 3d 对象不起作用
【发布时间】:2019-04-28 15:29:47
【问题描述】:

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

为了搜索放置的对象并避免获得无关性质的 hitTestResults(例如,选择平面或 ARWorldMap 本身),我尝试将 hitTest(_:options:) 与 SCNHitTestOption.categoryBitMask 一起使用。然而,hitTest 似乎返回所有类型的结果,而不仅仅是所选 categoryBitMask = 5 的对象,即使根据我的理解 categoryBitMask 是“仅搜索与指定位掩码匹配的对象的选项”。我该如何解决这个问题,有没有更好的方法在 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
    }
}

【问题讨论】:

    标签: swift scenekit arkit scnnode arscnview


    【解决方案1】:

    有没有更好的方法在 ARKit 中选择放置的 3D 模型

    不,你是对的。搜索 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

    【讨论】:

    • 谢谢!阅读您的答案后,只需将我的 categoryBitMask 值更改为 2 的幂即可。
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2018-09-05
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多