如何从SceneKit中的.dae文件访问文本元素?

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

我有一个.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

附加显示元素的xcode屏幕截图:enter image description here

ios objective-c swift scenekit skscene
2个回答
0
投票

SCNText特定于SceneKit。如果将3D文本导出为Collada文件,则它将与其他任何几何图形(面和顶点)一样,并且根本不会是动态的。无法通过从Collada文件中检索的内容创建SCNText实例。


0
投票

我已经遇到过类似的事情...要么删除标签节点并替换为您自己的节点,要么编辑.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
    }
© www.soinside.com 2019 - 2024. All rights reserved.