在SCNText中更改某些单词的颜色

时间:2019-06-22 17:07:51

标签: swift scenekit augmented-reality arkit scntext

我有一个SCNText,我在AR应用程序中显示它,但是我希望某些单词具有不同的颜色。

我尝试执行以下操作: How to change colour of the certain words in label - 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 个答案:

答案 0 :(得分:2)

单对象文本

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包中创建的3D文本(例如Maya,3dsMax,Cinema4D,Houdini,Blender),并使用手工制作的UV-mapped纹理。

  • 或者,如果您更喜欢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

如果您想使用非UV映射的纹理,请添加以下代码

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