在我在文档和互联网上阅读之后,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
可能不起作用的任何想法?我做错了吗?
答案 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]