我有一个.dae文件,其形状为勋章。现在,此.dae文件具有标签元素。我想加载此.dae文件,并希望在运行时更新该标签上的文本,以便用户名出现在此处。
let originalNode = scene?.rootNode.childNode(withName: "label", recursively: true)
if let _text = originalNode?.geometry as? SCNText {
_text.string = "Mohsin Khan"
}
// another way i tried
let originalNode = scene?.rootNode.childNode(withName: "label", recursively: true)
(originalNode?.geometry as! SCNText).string = "Mohsin Khan"
我尝试了各种方法,但是没有任何效果。对于
originalNode?.geometry as! SCNText // returning nil
SCNText
特定于SceneKit。如果将3D文本导出为Collada文件,则它将与其他任何几何图形(面和顶点)一样,并且根本不会是动态的。无法通过从Collada文件中检索的内容创建SCNText
实例。
我已经遇到过类似的事情...要么删除标签节点并替换为您自己的节点,要么编辑.dae文件并删除标签。然后,您可以将SCNText添加到要放置的位置。像此功能一样,您可以对所有字符进行弹跳,旋转和/或单独着色。您必须对其进行一些尝试才能使其正确定位,并且名称字符串的长度会有所不同。这使它变得复杂-一种解决方案是将其居中到固定宽度[--- Jim ---],并且不要超过最大长度。这也有挑战,但是希望这会带您进入球场。此代码对空格和换行符(breakAt)进行了一些特殊处理,您可以将其删除。
func addSCNText(vGroupNode: SCNNode, vPosition: SCNVector3, vScale: SCNVector3, vString: String)
{
var vX: Float = 0
for char in vString
{
let textGeometry = SCNText(string: String(char), extrusionDepth: 1.0)
textGeometry.font = AppColor.endWaveFont!
textGeometry.flatness = 0.2
textGeometry.firstMaterial?.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: textGeometry)
textNode.position.x = vX
vX += 12
if(breakAt != 0)
{
vGroupNode.addChildNode(textNode)
}
else
{
if(char != " ")
{
vGroupNode.addChildNode(textNode)
}
}
}
gNodes.gameNodes.addChildNode(vGroupNode)
vGroupNode.position = vPosition
vGroupNode.scale = vScale
}