ARkit-在渲染器中运行hittest(在渲染节点之前)

时间:2019-03-18 22:07:02

标签: swift scenekit arkit

我试图将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.. */ }
}

0 个答案:

没有答案