ios - 在 SceneKit 中跨球体绘制文本

标签 ios text 3d scenekit scnnode

我刚开始在我的 UIKit 应用程序中使用 SceneKit,目的是显示和操作一些 3D 模型。我需要显示一个球体,上面写有一些简短的文字。我正在像这样渲染球体:

let sphereGeometry = SCNSphere(radius: 1)
let sphereNode = SCNNode(geometry: sphereGeometry)
sphereNode.position = SCNVector3(x: -1, y: 0, z: 8)
sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan

self.rootNode.addChildNode(sphereNode)

我尝试使用 CATextLayer 来实现我所需要的,但我运气不佳。执行此操作的正确方法是什么?

最佳答案

您可以通过创建包含文本的图像将文本环绕在对象的表面,例如,

enter image description here

然后加载图像并将其分配给漫反射的 contents 属性

    let sphereGeometry = SCNSphere(radius: 1)
    let sphereNode = SCNNode(geometry: sphereGeometry)
    sphereNode.position = SCNVector3(x: 0, y: 0, z: 0)

    if let textImage = UIImage(named:"TextImage") {
        sphereGeometry.firstMaterial?.diffuse.contents = textImage
    }

    scene.rootNode.addChildNode(sphereNode)

enter image description here

或者,您可以通过以下方式以编程方式创建带有文本的图像

func imageWithText(text:String, fontSize:CGFloat = 150, fontColor:UIColor = .black, imageSize:CGSize, backgroundColor:UIColor) -> UIImage? {

    let imageRect = CGRect(origin: CGPoint.zero, size: imageSize)
    UIGraphicsBeginImageContext(imageSize)

    defer {
        UIGraphicsEndImageContext()
    }

    guard let context = UIGraphicsGetCurrentContext() else {
        return nil
    }

    // Fill the background with a color
    context.setFillColor(backgroundColor.cgColor)
    context.fill(imageRect)

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center

    // Define the attributes of the text
    let attributes = [
        NSFontAttributeName: UIFont(name: "TimesNewRomanPS-BoldMT", size:fontSize),
        NSParagraphStyleAttributeName: paragraphStyle,
        NSForegroundColorAttributeName: fontColor
    ]

    // Determine the width/height of the text for the attributes
    let textSize = text.size(attributes: attributes)

    // Draw text in the current context
    text.draw(at: CGPoint(x: imageSize.width/2 - textSize.width/2, y: imageSize.height/2 - textSize.height/2), withAttributes: attributes)

    if let image = UIGraphicsGetImageFromCurrentImageContext() {
        return image
    }
    return nil
}

并将图像应用到球体上

    let sphereGeometry = SCNSphere(radius: 1)
    let sphereNode = SCNNode(geometry: sphereGeometry)
    sphereNode.position = SCNVector3(x: 0, y: 0, z: 0)

    if let image = imageWithText(text: "Hello, World!", imageSize: CGSize(width:1024,height:1024), backgroundColor: .cyan) {
        sphereGeometry.firstMaterial?.diffuse.contents = image
    }

    scene.rootNode.addChildNode(sphereNode)

关于ios - 在 SceneKit 中跨球体绘制文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608164/

相关文章:

python - 从 C 访问 Numpy 矩阵作为 3D 数组

3d - 将 2d 图像转换为 3d 模型

iphone - 使用 Parse 从应用程序内打开和关闭推送通知

ios - NSTimer 在 swift 中运行得非常快

ios - 在数组中的对象上使用过滤器来查找最大值? [ swift ]

javascript - 用于将带缩写的文本拆分为句子的正则表达式

ios - 即使已发布 CIImageRefs,CIContext 内存泄漏

javascript - d3 防止文本延伸到 SVG 之外

r - ggplot2 绘图 : Change Text in Case it Exceeds the Plot Window when Exporting as PNG

javascript - CSS3,旋转后di​​v未正确对齐