【问题标题】:How to access text element from a .dae file in SceneKit?如何从 SceneKit 中的 .dae 文件访问文本元素?
【发布时间】: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 截图:

【问题讨论】:

    标签: ios objective-c swift scenekit skscene


    【解决方案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
        }
    

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 2015-01-18
      • 2022-01-23
      • 2020-02-15
      • 2017-01-19
      • 2014-10-10
      • 1970-01-01
      • 2015-05-10
      • 2016-03-27
      相关资源
      最近更新 更多