我正在构建一个简单的3D SceneKit演示,需要在平面上将多个动态文本渲染为纹理。
我有两个平面,每个平面上我要呈现不同的文本。这可以通过创建一个SceneKit场景和一个SKLabelNode
,将节点添加到场景中并为场景传递一个planes材质的属性来实现:
let myLabel = SKLabelNode(fontNamed: "Helvetica")
myLabel.text = "Lorem Ipsum"
myLabel.fontSize = 20
myLabel.fontColor = SKColor.green
myLabel.position = CGPoint(x: 50, y: 50)
skScene = SKScene(size: CGSize(width: 100, height: 100))
skScene?.addChild(myLabel)
let geometry = SCNPlane(width: 5.0, height: 5.0)
let plane = SCNNode(geometry: geometry)
let planeMaterial = SCNMaterial()
planeMaterial.diffuse.contents = skScene
geometry.firstMaterial = planeMaterial
sceneView.scene?.rootNode.addChildNode(plane)
这适用于带有文本的一架飞机,但是如果我想创建一个具有不同文本的新飞机呢?我是否希望:
A)继续为我需要的每个文本创建新的SKScene
和SKLabelNode
或
B)以某种方式重用原始的SKScene
,即在每次需要新纹理时调整其大小,绘制并对其进行栅格化吗?
我很确定正确的方法是重用它。我知道我可以使用SKTexture
将节点光栅化为.texture(),但不确定如何在我的情况下实现它。
我尝试做
let texture = self.spriteKitView?.texture(from: winner)
geometry.firstMaterial?.diffuse.contents = texture
尽管此方法构建成功,但我仍停留在白色而不是所需的文本纹理...
选项a)有很多优点(不用于记忆),但是您可以操纵材质内部的对象来创建炫酷效果。 (像时钟一样)
如果您真的想从之后的重用场景中获取SKTexture,则可以使用以下语法:
planeMaterial.diffuse.contents = SKView().texture(from: skScene)!
我用两个解决方案创建了这个示例,请看一下:https://github.com/Maetschl/SceneKitExamples/tree/master/SKTextureOverPlanes