I have successfully incorporated some basic 3D content into my SpriteKit-based app.
Next, I want to display some sprites overlaid on top of the 3D content, but can't manage to do so.
Manipulating the .zPosition porperty of the SK3DNode and SKSpriteNode involded doesn't seem to do it.
This is my code for both the Spritekit scene, and the SceneKit scene whose content is displayed within the SK3DNode:
SpriteKit-side:
import SpriteKit class SpriteKitScene: SKScene { override init(size: CGSize) { super.init(size: size) // Scene Background self.backgroundColor = .red // 3D Node let objectNode = SK3DNode(viewportSize: size) objectNode.scnScene = SceneKitScene() addChild(objectNode) objectNode.position = CGPoint(x: size.width/2, y: size.height/2) let camera = SCNCamera() let cameraNode = SCNNode() cameraNode.camera = camera objectNode.pointOfView = cameraNode objectNode.pointOfView?.position = SCNVector3(x: 0, y: 0, z: 60) objectNode.zPosition = -100 // 2D Sprite let sprite = SKSpriteNode(color: .yellow, size: CGSize(width: 250, height: 60)) sprite.position = objectNode.position sprite.zPosition = +100 addChild(sprite) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
SceneKit-side:
import SceneKit class SceneKitScene: SCNScene { override init() { super.init() let box = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 0) let material = SCNMaterial() material.diffuse.contents = UIColor.green box.materials = [material] let boxNode = SCNNode(geometry: box) boxNode.transform = SCNMatrix4MakeRotation(.pi/2, 1, 1, 1) self.rootNode.addChildNode(boxNode) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
The sprites seem to be rendered at exatly the "far plane" of the SK3DNode's camera; if I push my geometry back to the far plane, it gets clipped ewxactly where it "intersects" the srpite.