3

我正在使用 ARKit 2.0 来检测触发图像并将平面和对象放置在它上面。我希望一个特定的对象从我的触发图像下方逐渐出现并将其自身定位到它的一侧。为此,我运行一个动画来移动位置:

//Original Position
self.planeNode?.position = SCNVector3(0, -0.02, 0)

//New position
self.planeNode?.runAction(SCNAction.move(to: SCNVector3(0.08, -0.05, 0), duration: 0.5))

然而,触发图像并没有隐藏planeNode,我仍然可以在它上面看到它,即使它在技术上是在下面。

我想用具有相同图像的 planeNode 复制我的触发器,但是当用手或其他方式握住触发器时会显得很奇怪。

以下是该问题的一些图片:

触发器下方的图像,但显示在顶部 触发器下方的图像

4

2 回答 2

3

我通过使用遮挡找到了解决方案!本质上,我在触发器顶部创建了一个平面,它像这样遮挡了它后面的所有东西:

            //Set occlusion material
            let cardOcclusion = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            let holdout = SCNMaterial()
            holdout.isDoubleSided = true
            holdout.diffuse.contents = CIColor.black
            holdout.colorBufferWriteMask = SCNColorMask(rawValue: 0)
            cardOcclusion.firstMaterial? = holdout
            let cardOcclusionNode = SCNNode()
            cardOcclusionNode.eulerAngles.x = -.pi / 2
            cardOcclusionNode.geometry = cardOcclusion
            node.addChildNode(cardOcclusionNode)
于 2018-06-20T12:04:01.797 回答
0

您只需将 UiimageView对象放在代码下方的viewObj中即可。

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        let node = SCNNode()
        if let imageAnchor = anchor as? ARImageAnchor {
            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.8)
            let material = SCNMaterial()
            material.diffuse.contents = viewObj
            plane.materials = [material]
            let planeNode = SCNNode(geometry: plane)
            planeNode.eulerAngles.x = -.pi / 2
            node.addChildNode(planeNode)
        }
        return node
    }
于 2018-06-20T13:05:52.780 回答