Повторное использование одного SKView для создания нескольких SKTextures для использования в SceneKit - PullRequest
0 голосов
/ 04 марта 2020

Я создаю простую демонстрацию 3D SceneKit и мне нужно визуализировать несколько динамических c текстов в виде текстур на плоскостях.

У меня есть две плоскости, на каждой из которых я хочу визуализировать различный текст. Это возможно путем создания SceneKit Scene и SKLabelNode, добавления узла к сцене и передачи ему свойства материала плоскостей:

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 s и SKLabelNode s для каждого нужного мне текста или

B) Каким-то образом повторно использовать исходный SKScene, то есть изменять размер рисовать и растеризовать его каждый раз, когда нужна новая текстура? Я знаю, что могу растеризовать узел до SKTexture, используя .texture () , но не уверен, как мне реализовать его в моем случае.

Я пытался сделать

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

И хотя это успешно строится, я застрял с белым цветом вместо желаемой текстурной текстуры ...

1 Ответ

1 голос
/ 04 марта 2020

Вариант а) имеет много преимуществ (не для памяти), но вы можете манипулировать объектами внутри материала для создания крутых эффектов. (Как часы)

Если вы действительно хотите получить SKTexture от повторного использования Scene после, вы можете использовать этот синтаксис:

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

Я создаю этот пример с 2 решениями для вопроса, пожалуйста взгляните: https://github.com/Maetschl/SceneKitExamples/tree/master/SKTextureOverPlanes

enter image description here

...