Текст монообъекта
SCNText()
класс помогает вам создать 3D моно-объект-текст , следовательно, вы не можете отдельно получить доступ к каждому персонажу внутри него (в настоящее время API не позволяет вам иметь доступ к каждому персонажу). Вместо этого вы можете использовать текстуру для рисования всего объекта:
let text = scene.rootNode.childNode(withName: "text node", recursively: true)!
text.geometry?.materials.first?.diffuse.contents = UIImage(named: "rainbow.jpg")
Но вы получите артефакты текстуры на боковых гранях объекта SCNText
.
Решение
Таким образом, существует два возможных подхода к использованию разных текстур для разных персонажей в трехмерном тексте :
Использование 3D-текста, созданного в 3D-пакете (например, Maya, 3dsMax, Cinema4D, Houdini, Blender) с созданными вручную UV-картированными текстурами.
Или, если вы предпочитаете SceneKit, используйте слова, содержащие отдельные SCNText
символов, каждый из которых имеет желаемую текстуру. Таким образом, вам нужно привязать несколько отдельных элементов SCNText
к одному ParentNode, чтобы переместить, повернуть и масштабировать его как объединенную группу.
Текст для нескольких объектов
Если вы хотите использовать simple color mapping
(не текстуру) - используйте мой код :
func addARWords(_ word01: String, _ word02: String, _ word03: String) {
let textGeometry01 = SCNText(string: word01, extrusionDepth: 1.0)
textGeometry01.font = NSFont(name: "Arial", size: 10)
textGeometry01.flatness = 0.2
textGeometry01.firstMaterial?.diffuse.contents = UIColor.yellow
let textNode01 = SCNNode(geometry: textGeometry01)
let textGeometry02 = SCNText(string: word02, extrusionDepth: 1.0)
textGeometry02.font = NSFont(name: "Arial", size: 10)
textGeometry02.flatness = 0.2
textGeometry02.firstMaterial?.diffuse.contents = UIColor.brown
let textNode02 = SCNNode(geometry: textGeometry02)
textNode02.position.x = 7
let textGeometry03 = SCNText(string: word03, extrusionDepth: 1.0)
textGeometry03.font = NSFont(name: "Arial", size: 10)
textGeometry03.flatness = 0.2
textGeometry03.firstMaterial?.diffuse.contents = UIColor.blue
let textNode03 = SCNNode(geometry: textGeometry03)
textNode03.position.x = 14
let groupNode = SCNNode()
groupNode.addChildNode(textNode01)
groupNode.addChildNode(textNode02)
groupNode.addChildNode(textNode03)
scene.rootNode.addChildNode(groupNode)
groupNode.scale = SCNVector3(x: 2, y: 2, z: 2)
}
addARWords("A", "R", "Kit")
И если вы хотите использовать текстуру без УФ-карты - добавьте этот код :
textGeometry01.firstMaterial?.diffuse.contents = UIImage(named: "rainbow.jpg")
textGeometry02.firstMaterial?.diffuse.contents = UIImage(named: "leopard.jpg")
textGeometry03.firstMaterial?.diffuse.contents = UIImage(named: "zebra.jpg")