重复使用单个SKView生成多个SKTexture以在SceneKit中使用

问题描述 投票:0回答:1

我正在构建一个简单的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)继续为我需要的每个文本创建新的SKSceneSKLabelNode

B)以某种方式重用原始的SKScene,即在每次需要新纹理时调整其大小,绘制并对其进行栅格化吗?

我很确定正确的方法是重用它。我知道我可以使用SKTexture将节点光栅化为.texture(),但不确定如何在我的情况下实现它。

我尝试做

let texture = self.spriteKitView?.texture(from: winner)
geometry.firstMaterial?.diffuse.contents = texture

尽管此方法构建成功,但我仍停留在白色而不是所需的文本纹理...

ios swift sprite-kit scenekit
1个回答
0
投票

选项a)有很多优点(不用于记忆),但是您可以操纵材质内部的对象来创建炫酷效果。 (像时钟一样)

如果您真的想从之后的重用场景中获取SKTexture,则可以使用以下语法:

planeMaterial.diffuse.contents = SKView().texture(from: skScene)!

我用两个解决方案创建了这个示例,请看一下:https://github.com/Maetschl/SceneKitExamples/tree/master/SKTextureOverPlanes

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.