0 Replies
      Latest reply on May 2, 2020 10:39 PM by UIKid
      UIKid Level 1 Level 1 (0 points)

        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.