Я отображаю некоторые базовые 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")
}
}
... И полученный результат :
(я хочу желтый прямоугольник над зеленым квадратом)