Я помещаю объект на стену, затем пытаюсь распознать нажатие на нее, но тест попадания возвращает 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 - установить с добавленными объектами. Когда я добавил трансформирующее преобразование с изменением координаты Z по крайней мере на 0,05 (близко к камере), обнаружил, что работает хорошо. По крайней мере, до смены плоскости и продвижения вперед по узлу.