添加SCNBillboardConstraint会使节点消失

时间:2018-03-09 13:12:35

标签: ios swift scenekit arkit

在我在文档和互联网上阅读之后,SCNBillboardConstraint会将节点旋转到始终面向pointOfView节点 - 对于ARKit,用户的相机。

问题是,当我向子节点添加SCNBillboardConstraint时,它会消失。节点只是添加了一些SCNTexts作为更复杂模型的子项。 层次结构如下所示:RootNode - >文本节点(其中两个)。

在我将根节点添加到场景的根节点之后,我按以下方式添加此约束:

updateQueue.async {
    self.sceneView.scene.rootNode.addChildNode(virtualObject)
    self.sceneView.addOrUpdateAnchor(for: virtualObject)
    self.addBillboardContraintsToText(object: virtualObject)
}

func addBillboardContraintsToText(object: VirtualObject) {
    guard let storeNode = object.childNodes.first else {
           return
   }

   for node in storeNode.childNodes {
        if let geometry = node.geometry, geometry.isKind(of: SCNText.self) {
            let billboard = SCNBillboardConstraint()
            node.constraints = [billboard]
        }
    }
}

文本节点的位置相对于其根节点设置正确,因此没有问题。当我添加SCNLookAtConstraint时,它可以正常工作。

node.pivot = SCNMatrix4Rotate(node.pivot, Float.pi, 0, 1, 0)
let lookAt = SCNLookAtConstraint(target: sceneView.pointOfView)
lookAt.isGimbalLockEnabled = true
node.constraints = [lookAt]

SCNBillboardConstraint可能不起作用的任何想法?我做错了吗?

1 个答案:

答案 0 :(得分:0)

此代码(带有Apple CupScn)对我来说效果很好:

cupNode.position = SCNVector3(0.5,0,-0.5)
    guard let virtualObjectScene = SCNScene(named: "cup.scn", inDirectory: "Models.scnassets/cup") else {
        return
    }
    let wrapperNode = SCNNode()
    for child in virtualObjectScene.rootNode.childNodes {
        child.geometry?.firstMaterial?.lightingModel = .physicallyBased
        wrapperNode.addChildNode(child)
    }
    cupNode.addChildNode(wrapperNode)
    scene.rootNode.addChildNode(cupNode)

    let billboardConstraint = SCNBillboardConstraint()
    billboardConstraint.freeAxes = SCNBillboardAxis.Y
    cupNode.constraints = [billboardConstraint]