DrWhat
DrWhat

Reputation: 2490

In SceneKit, putting a text label onto SCNGeometry or SCNBox

I'm trying to put a simple text label onto one (hopefully all types) of built in SCNGeometry shapes as they move across the screen. The closest I have come to success is adding a CALayer with CATextLayer to a SCNBox via .firstMaterial.diffuse.contents, as described in this thread.

BUT, the text is never readable. With a SCNBox of height 1.0: when the size of the layer.frame and textLayer.fontSize is 1.0, the text does not appear; as the frame and font size increase (not the box) the text appears blotchy, like in the image below; and when very large, the text appears as squiggly lines.

enter image description here

The following code is part of the method that spawns shapes:

    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)

Upvotes: 1

Views: 1660

Answers (1)

DrWhat
DrWhat

Reputation: 2490

As pointed out by David R., the units of the box size is not the same as the units of the frame size.

It worked after adjusting the frame to (and optimising SCNBox size):

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

Upvotes: 2

Related Questions