【发布时间】:2023-04-04 14:03:01
【问题描述】:
我正在使用 SK3DNode 的实例在我的 SpriteKit 场景中显示一些基本的 3D 几何图形,以显示 SceneKit 场景的内容,如 Apple's article here 中所述。
我已经能够使用 SceneKit 节点变换和 SK3DNode 的位置/视口大小来定位节点和 3D 内容。
接下来,我想在我的 SpriteKit 场景中显示其他一些精灵叠加在 3D 内容之上,但我无法这样做:SK3DNode 的内容始终绘制在顶部。
我尝试同时指定 SK3DNode 和 SKSpriteNode 的 zPosition 属性,但无济于事。
来自 Apple 关于 SK3DNode 的文档:
使用 SK3DNode 对象将 3D SceneKit 内容合并到 基于 SpriteKit 的游戏。当 SpriteKit 渲染节点时,SceneKit 场景是动画并首先渲染的。然后这个渲染的图像是 合成到 SpriteKit 场景中。使用 scnScene 属性 指定要渲染的 SceneKit 场景。
(强调我的)
关于 z-order 有点模棱两可(它似乎只提到了渲染发生的 temporal 顺序)。
我整理了一个minimal demo project on GitHub;相关代码为:
1. SceneKit 场景
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 场景
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")
}
}
...而渲染结果是:
(我想要黄色矩形在绿色框上方)
【问题讨论】:
标签: ios sprite-kit scenekit