如何从 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 文件访问文本元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 .dae 文件加载到 iOS SceneKit 中的 SCNNode 中?