【发布时间】:2017-02-17 06:11:26
【问题描述】:
我使用 SceneKit 制作了广告牌四边形。 cameraNode 与 UIDeviceMotion 同步,广告牌节点按我预期出现。 问题是,我希望在点击它时调用这些节点。 为此,我使用了带有 hitTest 的 UITapGestureRecognizer。 这是我的一些代码。
// ==== in viewDidLoad
// initialize tap gesture
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onNodeTapped))
sceneView.addGestureRecognizer(tapGesture)
// initialize scenekit.scene
let scene = SCNScene()
scene.rootNode.addChildNode(cameraNode)
scene.rootNode.addChildNode(worldNode)
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.pointOfView = cameraNode
这是点击处理程序
func onNodeTapped(_ gestureRecognize: UIGestureRecognizer) {
let location = gestureRecognize.location(in: sceneView) // <---- updated
let hitResults = sceneView.hitTest(location, options: nil)
for result in hitResults {
// FOR_TEST: hit test visualization
if let material = result.node.geometry?.materials.first {
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
SCNTransaction.completionBlock = {
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
material.emission.contents = UIColor.black
SCNTransaction.commit()
}
material.emission.contents = UIColor.red
SCNTransaction.commit()
}
// target tap event handling
if let target = (result.node as? TargetNode)?.target {
if onTargetTapped(target) {
return
}
}
}
}
此代码很少使用。我的意思是可视化部分仅响应 20 次中的 1 次,而 onTargetTapped 仅被称为 100 次中的 1 次... 奇怪的是瞄准很好,这意味着这不是坐标问题。
我发现了一些与 SCNHitTestOption.categoryBitMask 相关的东西,但它根本没有帮助。
此外,当我打开此 Scenview 时,控制台上会出现此错误消息。 “[SceneKit] 错误:_C3DUnProjectPoints 中的错误” 也许这个消息与 hitTest 故障有关?
更新
此代码用于构建广告牌 SCNGeometry 和 SCNNode
override func initializeGeometry() -> SCNGeometry {
let geometry = SCNPlane(width: width, height: height)
let material = geometry.materials.first
material?.diffuse.contents = initializeTexture()
material?.writesToDepthBuffer = false
material?.readsFromDepthBuffer = false
return geometry
}
// ==== 构建节点
node = SCNNode()
node.geometry = initializeGeometry()
node.categoryBitMask = MyConstraints.targetNodeHitTestCategoryBitMask
node.constraints = [SCNBillboardConstraint()]
【问题讨论】:
-
我们可以看看设置广告牌的代码吗?