Изменение цвета определенных слов в SCNText - PullRequest
1 голос
/ 22 июня 2019

У меня есть SCNText, который отображается в приложении AR, но я бы хотел, чтобы некоторые слова были другого цвета.

Я пытался сделать следующее: Как изменить цветнекоторых слов в метке - Swift 3 , но NSString и метки отличаются от SCN (конечно), так что это не сработало.

Ниже приведен мой текущий код, показывающий, что я делаю:

func addARWords(_ words: String) {

    let scene = SCNScene()
    var highlightedWords = [String]() 

    textGeometry = SCNText(string: words, extrusionDepth: 1.0)
    textGeometry.font = UIFont(name: "Arial", size: 10)
    textGeometry.flatness = 0.2

    textNode = SCNNode(geometry: textGeometry)
    textNode.position = SCNVector3(myTextPosition.x, myTextPosition.y, myTextPosition.z)
    textNode.scale = SCNVector3(myTextScale,  myTextScale, myTextScale)
    scene.rootNode.addChildNode(textNode)
    sceneView.scene = scene
}

1 Ответ

2 голосов
/ 23 июня 2019

Текст монообъекта

SCNText() класс помогает вам создать 3D моно-объект-текст , следовательно, вы не можете отдельно получить доступ к каждому персонажу внутри него (в настоящее время API не позволяет вам иметь доступ к каждому персонажу). Вместо этого вы можете использовать текстуру для рисования всего объекта:

let text = scene.rootNode.childNode(withName: "text node", recursively: true)!
text.geometry?.materials.first?.diffuse.contents = UIImage(named: "rainbow.jpg")

enter image description here

enter image description here

Но вы получите артефакты текстуры на боковых гранях объекта 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")

enter image description here

И если вы хотите использовать текстуру без УФ-карты - добавьте этот код :

textGeometry01.firstMaterial?.diffuse.contents = UIImage(named: "rainbow.jpg")
textGeometry02.firstMaterial?.diffuse.contents = UIImage(named: "leopard.jpg")
textGeometry03.firstMaterial?.diffuse.contents = UIImage(named: "zebra.jpg")

enter image description here

...