首页 文章

在 SceneKit 中,将文本标签放在 SCNGeometry 或 SCNBox 上

提问于
浏览
1

我试图在屏幕上移动时将一个简单的文本标签放在一个(希望是所有类型)的内置 SCNGeometry 形状上。我最接近成功的是将带有 CATextLayer 的 CALayer 通过.firstMaterial.diffuse.contents 添加到 SCNBox,为在这个帖子中描述

但是,文本永远不可读。使用高度为 1.0 的 SCNBox:当 layer.frame 和 textLayer.fontSize 的大小为 1.0 时,文本不会出现;随着框架和字体大小的增加(不是框)文本出现斑点,如下图所示;当非常大时,文本显示为波浪线。

在此输入图像描述

以下代码是生成形状的方法的一部分:

var geometry:SCNGeometry

    let layer = CALayer()
    layer.frame = CGRect(x: 0, y: 0, width: 4, height: 4)
    layer.backgroundColor = UIColor.white.cgColor

    var textLayer = CATextLayer()
    textLayer.frame = layer.bounds
    textLayer.fontSize = layer.bounds.size.height
    textLayer.string = "Matilda"
    textLayer.alignmentMode = kCAAlignmentLeft
    textLayer.foregroundColor = UIColor.black.cgColor
    textLayer.display()
    layer.addSublayer(textLayer)

    let geometry = SCNBox(width: 1.0,
                          height: 1.0, 
                          length: 3.0,
                          chamferRadius: 0.0)

    geometry.firstMaterial?.locksAmbientWithDiffuse = true
    geometry.firstMaterial?.diffuse.contents = layer

    let geometryNode = SCNNode(geometry: geometry)
    geometryNode.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)

    scnScene.rootNode.addChildNode(geometryNode)

1 回答

  • 2

    正如 David R.所指出的,盒子大小的单位与帧大小的单位不同。

    调整帧到(并优化 SCNBox 大小)后它工作:

    layer.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
    

相关问题