Отображение живой информации в 3d с использованием arkit, возможно с использованием scntext

Я пытался заставить это работать в течение 3 дней. Для моего проекта мне нужно отобразить изменяющиеся значения в виде трехмерного текста, представленного в приложении AR, написанном на Swift для iOS.

Что я уже нашел: я могу использовать следующий код для генерации статического текста в 3 d в определенном месте. Я могу поместить его в метод ViewDidLoad моего ViewController, чтобы он загружался один раз при запуске.

let text = SCNText(string: "Let's begin!", extrusionDepth: 1)

//Create material
let material = SCNMaterial()
material.diffuse.contents = UIColor.green
text.materials = [material]

//Create Node object
let textNode = SCNNode()
textNode.scale = SCNVector3(x:0.004,y:0.004,z:0.004)
textNode.geometry = text
textNode.position = SCNVector3(x: 0, y:0.02, z: -0.5)

sceneView.scene.rootNode.addChildNode(textNode)

Теперь моя проблема в том, что я не могу заставить его периодически меняться и говорить до 10000.

Я испробовал довольно много идей, но ни одна не показала счет.

ОБНОВЛЕНИЕ: У меня проблемы с удалением узла после его создания. Также я не знаю точно, когда я должен удалить это.

Я получаю неверный код доступа =1 ошибка. Кажется, проблема заключается в поиске и удалении узла, потому что, если я прокомментирую строку, приложение запустится. Это может иметь отношение к привилегиям доступа.

Это моя функция:

func updateSCNText2 (входящий: Int) {

    // create new text
    let text = SCNText(string: String(incomingInt), extrusionDepth: 1)
    //  create material
    let material = SCNMaterial()
    material.diffuse.contents = UIColor.green
    text.materials = [material]

    //Create Node object
    let textNode = SCNNode()
    textNode.name = "textNodeName"
    textNode.scale = SCNVector3(x:0.004,y:0.004,z:0.004)
    textNode.geometry = text
    textNode.position = SCNVector3(x: 0, y:0.02, z: -0.5)

    //  add new node to root node
    sceneView.scene.rootNode.addChildNode(textNode)

    //  find & remove previous node (childNodeWithName)
    sceneView.scene.rootNode.childNode(withName: "textNodeName", recursively: false)?.removeFromParentNode()

}

Где я вызываю функцию:

var k = 0

func renderer(_ renderer: SCNSceneRenderer,
              updateAtTime time: TimeInterval) {

    print(k)
    updateSCNText2(incomingInt:  k)
    k = k+1
}

Большое спасибо, что нашли время!

1 ответ

Решение

Лучший способ сделать это с помощью NSTimer

Во-первых, установите textNode и счетчик var в верхней части вашего класса ViewController.

var textNode: SCNNode!

var counter = 0

внутри viewDidLoad добавьте вызов NSTimer:

var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)

оставить исходный метод создания textNode во ViewDidLoad за исключением того, что textNode теперь var

это функция обновления

@objc func update() {

    counter += 1

    // remove the old textNode

    textNode.removeFromParentNode()

        // create new text
        let text = SCNText(string: String(counter), extrusionDepth: 1)
        //  create material
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.green
        text.materials = [material]

        //Create Node object
    textNode = SCNNode()
    textNode.scale = SCNVector3(x:0.004,y:0.004,z:0.004)
    textNode.geometry = text
    textNode.position = SCNVector3(x: 0, y:0.02, z: -0.5)

    //  add new node to root node
    self.sceneView.scene.rootNode.addChildNode(textNode)

}

Примечание: этот код работает, только что протестировал его на игровой площадке. Могу предоставить при необходимости.

Другие вопросы по тегам