Как получить доступ к текстовому элементу из файла .dae в SceneKit? - PullRequest
0 голосов
/ 16 января 2020

У меня есть файл .dae в форме медали. Теперь этот файл .dae имеет элемент label. Я хочу загрузить этот файл .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

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Я сталкивался с чем-то похожим ... либо удалите узел метки и замените свой собственный, либо отредактируйте файл .dae и удалите метку. Затем вы можете добавить текст SCNText в любое место, где вы хотите его разместить. Нечто подобное этой функции позволяет отбрасывать, поворачивать и / или индивидуально раскрашивать все символы. Вам придется поэкспериментировать с этим, чтобы получить его в нужном месте, и длина строки имени будет варьироваться. Это усложняет это - одно решение состоит в том, чтобы центрировать его в фиксированной ширине [--- Джим ---] и не превышать go максимальной длины. Это также имеет свои проблемы, но, надеюсь, это поможет вам в этом. Этот код выполняет специальную обработку пробелов и разрывов строк (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
    }
0 голосов
/ 17 января 2020

SCNText указывается c для SceneKit. Если вы экспортируете трехмерный текст как файл Collada, он будет похож на любую другую геометрию (грани и вершины) и вообще не будет динамическим c. Невозможно создать экземпляр SCNText из чего-то, извлеченного из файла Collada.

...