SceneKitを使用してビルボードクワッドを作成しました。 cameraNodeはUIDeviceMotionと同期されており、予想通りにビルボードノードが表示されます。 事は、私はそれをタップすると、これらのノードを呼び出すことです。 このため、私はhitTestでUITapGestureRecognizerを使用しました。 ここに私のコードのいくつかがあります。SceneKit:ビルボードのクワッドでヒットテストが動作しない
// ==== 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
そして、これは、このコードは非常にrarly作品タップハンドラ
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()]
看板を設定するコードは表示できますか? –