Невозможно отобразить спрайты выше SK3DNode - PullRequest
1 голос
/ 03 мая 2020

Я отображаю некоторые базовые c 3D-геометрии в моей сцене SpriteKit, используя экземпляр SK3DNode для отображения содержимого сцены SceneKit, как объяснено в статье Apple здесь .

Я смог расположить узел и 3D-содержимое так, как я хочу, используя преобразования узлов SceneKit и размер позиции / области просмотра SK3DNode.

Далее я хочу отобразить некоторые другие спрайты в моей сцене SpriteKit с наложением поверх 3D-контента , но я не могу этого сделать: содержимое SK3DNode всегда отображается на top.

Я попытался указать свойство zPosition для SK3DNode и SKSpriteNode, но безрезультатно.

Из документации Apple по SK3DNode:

Используйте объекты SK3DNode для включения содержимого 3D SceneKit в игру на основе SpriteKit. Когда SpriteKit отображает узел, сцена SceneKit анимируется и отображается первой. Затем это визуализированное изображение накладывается на сцену SpriteKit . Используйте свойство scnScene, чтобы указать сцену SceneKit, которую нужно визуализировать.

(выделение мое)

Это немного неоднозначно в отношении z-порядка ( кажется, только упоминается временной порядок, в котором происходит рендеринг).

Я собрал минимальный демонстрационный проект на GitHub ; соответствующий код:

1. SceneKit Scene

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")
    }
}

2. SpriteKit Scene

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")
    }
}

... И полученный результат :

enter image description here

(я хочу желтый прямоугольник над зеленым квадратом)

...