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

Posted

技术标签:

【中文标题】如何从 SceneKit 中的 .dae 文件访问文本元素?【英文标题】:How to access text element from a .dae file in SceneKit? 【发布时间】:2020-05-03 11:06:30 【问题描述】:

我有一个奖牌形状的 .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 截图:

【问题讨论】:

【参考方案1】:

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

【讨论】:

还有其他方法吗?【参考方案2】:

我遇到过类似的情况...要么删除标签节点并替换您自己的节点,要么编辑 .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
    

【讨论】:

以上是关于如何从 SceneKit 中的 .dae 文件访问文本元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建要在 SceneKit 中使用的 DAE 文件?

如何将 .dae 文件加载到 iOS SceneKit 中的 SCNNode 中?

如何从 Xcode 中导入的 .dae 中访问混合形状

如何将复杂的 .dae 模型导入到 SceneKit?

从 Collada (.dae) 文件(在 Maya 中创建)导入的 SceneKit 键控混合形状动画未播放

SceneKit - 如何获取 .dae 模型的动画?