我试图将SCNNode
中的ARSCNView
从屏幕中心的hittest
返回。
我通常可以使用给定的代码执行此操作,但是当我在渲染器功能(首次尝试)中执行此操作时,节点很少会从hittest中返回。我相信这是因为尚未渲染节点,而hittest仅测试了渲染的节点吗?
如果我将hittest代码移至renderer(... didRenderScene, atTime ...)
(第二次尝试)中,则新添加的节点总是从hittest中返回,但是它们被渲染两次(一次在节点更新之后,一次在之后场景被渲染),因此由于被渲染两次,它们具有某种闪烁效果。可以在渲染节点之前进行击键测试吗?
第一次尝试:
func updateNodes(nodes: [SCNNode]) {
for node in nodes {
self.scene.rootNode.addChildNode(node)
}
}
public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
updateNodes(nodes) // new nodes
let screenCenter = CGPoint(x: bounds.midX, y: bounds.midY)
let hitTestResults = self.hitTest(screenCenter)
if (!hitTestResults.isEmpty) { /* found match! change node color etc.. */ }
}
第二次尝试:
func updateNodes(nodes: [SCNNode]) {
for node in nodes {
self.scene.rootNode.addChildNode(node)
}
}
public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
updateNodes(nodes) // new nodes
}
public func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
let screenCenter = CGPoint(x: bounds.midX, y: bounds.midY)
let hitTestResults = self.hitTest(screenCenter)
if (!hitTestResults.isEmpty) { /* found match! change node color etc.. */ }
}