添加一个SCNBillboardConstraint会使节点消失。

16

根据我在文档和网络上所了解到的,SCNBillboardConstraint可以使节点始终面向视点节点-在ARKit中是用户的相机。

问题在于,当我将一个SCNBillboardConstraint添加到子节点时,它会消失。这些节点只是作为更复杂模型的子节点添加的一些SCNTexts。 层级关系看起来像这样:根节点 - >文本节点(其中有两个)。

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

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可能不起作用?我做错了什么吗?


你看过 .freeAxes 参数了吗?例如:billboard.freeAxes = SCNBillboardAxis.Y - BlackMirrorz
是的,它没有任何影响。标签仍然没有显示出来。 - Cyupa
这里也有同样的问题,如果我添加了SCNBillboardConstraint,则带有SCNTextSCNode不会出现。 - MDompekidis
1个回答

0

这个代码(带有苹果的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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接