【问题标题】:Changing certain words' colour in SCNText更改 SCNText 中某些单词的颜色
【发布时间】:2019-06-22 17:07:51
【问题描述】:

我有一个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
}

【问题讨论】:

    标签: swift scenekit augmented-reality arkit scntext


    【解决方案1】:

    单对象文本

    SCNText() 类可帮助您创建 3D mono-object-text,因此您无法单独访问其中的每个字符(目前 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)中创建的 3D 文本和手工制作的 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")
    

    如果您想使用非 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")
    

    【讨论】:

    • 感谢您的详细回复!我很快就会尝试,你帮了大忙!我正在研究让多个节点来执行此操作的想法,但不确定如何执行它,您的代码很简单,并且对此事有很好的解释。再次感谢!
    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多