Отображение живой информации в 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)
}
Примечание: этот код работает, только что протестировал его на игровой площадке. Могу предоставить при необходимости.