添加 SCNBillboardConstraint 会使节点消失

问题描述 投票:0回答:1

根据我在文档和互联网上阅读的内容,

SCNBillboardConstraint
将旋转节点以始终面向pointOfView节点 - 在
ARKit
的情况下,即用户的相机。

问题是,当我向子节点添加

SCNBillboardConstraint
时,它就消失了。这些节点只是作为更复杂模型的子子项添加的一些
SCNTexts
。 层次结构看起来像这样:RootNode -> Text 节点(其中两个)。

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

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

ios swift scenekit arkit
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]
© www.soinside.com 2019 - 2024. All rights reserved.