我将一个对象放在墙上,然后尝试识别它上面的轻敲,但点击测试返回0个对象。当我改变物体的z位置,把它放在离凸轮稍近一点的地方,它就被很好地识别出来了,但这不是一个解决方案,因为平面总是在变化,它可以在任何时刻覆盖物体。我如何才能使HitTest正确工作并识别飞机后面的节点?或者,也许,我用了错误的方法?
fileprivate func addNode(atPoint point: CGPoint) {
let hits = sceneView.hitTest(point, types: .existingPlaneUsingExtent)
if hits.count > 0, let firstHit = hits.first, let originNode = originNode {
let node = originNode.clone()
sceneView.scene.rootNode.addChildNode(node)
node.position = SCNVector3Make(firstHit.worldTransform.columns.3.x, firstHit.worldTransform.columns.3.y, firstHit.worldTransform.columns.3.z)
let resize = simd_float4x4(SCNMatrix4MakeScale(0.2, 0.2, 0.2))
let rotation = simd_float4x4(SCNMatrix4MakeRotation(.pi / 2, -1, 0, 0))
let transform = simd_mul(firstHit.worldTransform, resize)
let finalTransform = simd_mul(transform, rotation)
node.simdTransform = finalTransform
addedNodes.insert(node)
}
}
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
print("Unable to identify touches on any plane. Ignoring interaction...")
return
}
let touchPoint = touch.location(in: sceneView)
let hits = sceneView.hitTest(touchPoint, options: [SCNHitTestOption.boundingBoxOnly: true])
let filtered = hits.filter({ addedNodes.contains($0.node) })
print("\(hits.count) vs \(filtered.count), \(hits.first?.node.name ?? "no name")")
if let node = filtered.first?.node {
node.removeFromParentNode()
addedNodes.remove(node)
return
}
addPictureToPlane(atPoint: touchPoint)
}
addednodes-用添加的对象设置。当我添加平移变换时,至少在0.05(靠近相机)上更改Z坐标,检测工作良好。至少在飞机改变和向前移动节点之前。
最佳答案
我相信您需要做的是更改您的SCNHitTestSearchMode
参数,该参数允许您设置:
与命中测试一起使用的SearchMode选项的可能值
方法。
static let searchMode: SCNHitTestOption
据此:
此键的值是包含原始
SCnhittesSearchMode常量的整数值。
在Apple Docs中,您可以在这里使用三种可能的选项:
case all
命中测试应返回所有可能的结果,并从最近的
最远。
case any
命中测试应该只返回找到的第一个对象,而不管
距离。
case closest
命中测试应只返回找到的Closes对象。
因此,根据您的问题,您可能需要使用
all case
。因此,您的
hitTest function
可能需要看起来像这样(记住self.augmentedRealityView
指的是一个ARSCNView
):override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1. Get The Current Touch Location
guard let currentTouchLocation = touches.first?.location(in: self.augmentedRealityView) else { return }
//2. Perform An SCNHitTest Setting The SearchMode To 1 (All) Which Returns A List Of Results Sorted From Nearest To Farthest
if #available(iOS 11.0, *) {
let hitTestResults = self.augmentedRealityView.hitTest(currentTouchLocation, options: [SCNHitTestOption.searchMode: 1])
//3. Loop Through The Results & Get The Nodes
for index in 0..<hitTestResults.count{
let node = hitTestResults[index]
print(node)
}
}
}
关于swift - hitTest(_:options :)不识别ARKit平面后面的节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50106266/