swift - ARKit hitTest(_:options:) 选择放置的 3d 对象不起作用
问题描述
我正在尝试选择一个已放置在检测到的平面上的对象,以便对其执行各种任务,例如通过手势旋转。
为了搜索放置的对象并避免获得无关性质的 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
}
}
解决方案
有没有更好的方法在 ARKit 中选择放置的 3D 模型
不,你是对的。SCNSceneRenderer.hitTest(_:, options:)
在搜索 SceneKit 内容和ARSCNView.hitTest(_:types:)
搜索 ARKit 识别的真实对象时使用。
这里似乎有问题的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
.
推荐阅读
- javascript - 遍历嵌套的 Javascript 对象
- java - 如何停止Wildfly11加载jar依赖webservices
- silktest - 在 Silk4j 中的应用程序之间切换
- javascript - 流程无法决定在联合类型上选择哪种情况
- java - 当卡夫卡关闭时,卡夫卡消费者挂起投票
- wildfly - 如何将 JSF 2.3 与 wildfly-swarm / thorntail 一起使用?
- rust - 当一个值在 Rust 中移动时,堆栈会发生什么?
- scala - Spark scala中两个数据帧的不等式记录的左外连接
- laravel - Laravel 5.6 composer 没有安装我的包的依赖项
- java - 使用 Fillo API 读取 Excel 文件