Search code examples
iosswiftscenekitscntext

Swift Scenekit - Centering SCNText - the getBoundingBoxMin:Max issue


Having fun with the alignmentMode option on SCNText. Been googling around and it looks like there is a problem with alignmentMode and containerFrame. The alternatives I've found suggest using the get bounding box function to find the text size and then manually adjust accordingly. Great except I cant get the function to work. When I try to get the two vectors I get an error:

'SCNVector3' is not convertible to 'UnsafeMutablePointer < SCNVector3>'

I get that both on the geometry and the node. example of the code is below

func setCounterValue(counterValue:Int) {

    var v1 = SCNVector3(x: 0,y: 0,z: 0)
    var v2 = SCNVector3(x: 0,y: 0,z: 0)


    _counterValue = counterValue

    let newText = SCNText(string: String(format: "%06d", counterValue), extrusionDepth:sDepth)
    newText.font = UIFont (name: "Arial", size: 3)
    newText.firstMaterial!.diffuse.contents = UIColor.whiteColor()
    newText.firstMaterial!.specular.contents = UIColor.whiteColor()

    newText.getBoundingBoxMin(v1, max: v2)

    _textNode = SCNNode(geometry: newText)
    _textNode.getBoundingBoxMin(v1, max: v2)

}

Any suggestions greatly appreciated.


Solution

  • OK so my final code solution looks like:

    func setCounterValue(counterValue:Int) {
    
        var v1 = SCNVector3(x: 0,y: 0,z: 0)
        var v2 = SCNVector3(x: 0,y: 0,z: 0)
    
        _textNode.removeFromParentNode()
        _counterValue = counterValue
    
        let newText = SCNText(string: String(format: "%08d", counterValue), extrusionDepth:sDepth)
        newText.font = UIFont (name: "Arial", size: 3)
        newText.firstMaterial!.diffuse.contents = UIColor.whiteColor()
        newText.firstMaterial!.specular.contents = UIColor.whiteColor()
    
        _textNode = SCNNode(geometry: newText)
        _textNode.getBoundingBoxMin(&v1, max: &v2)
    
        let dx:Float = Float(v1.x - v2.x)/2.0
        let dy:Float = Float(v1.y - v2.y)
        _textNode.position = SCNVector3Make(dx, dy, Float(sDepth/2))
    
        node.addChildNode(_textNode)
    
    }
    

    I've left in my couple of global variables, but should make sense.

    Thanks for the help all.