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
时,它会包含在结果中,因为 101
和 001
具有匹配位。
您可以使用的是 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
.
我正在尝试 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
时,它会包含在结果中,因为 101
和 001
具有匹配位。
您可以使用的是 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
.