Como importar uma cena do Blender para o SceneKit

Primeiramente precisamos ter a nossa cena no Blender (uma cena é composta por um ou mais objetos). Neste artigo eu vou usar uma caneca como exemplo:

E agora precisamos exportar a cena, aqui vou exportar como .usd* (não esqueça de exportar junto com o objeto uma câmera):

Agora vamos criar um projeto em SwiftUI padrão no Xcode:

Vamos arrastar a nossa cena para dentro do projeto, adicionar o nosso projeto como alvo e terminar.

Vamos entrar na nossa cena e no canto direito exportar para SceneKit. Isso irá criar um cópia do arquivo em formato .scn, se você preferir pode excluir o arquivo anterior.

E nessa tela nós podemos alterar o que quisermos da cena, como por exemplo, mudar a posição de alguns objetos, ou mudar o material ou excluir algum nó.

Agora com a nossa cena adicionada no projeto vamos para o código, precisamos criar uma SceneView. Não se esqueça de importar o SceneKit!

struct ContentView: View {
var body: some View {
ZStack {
SceneView(
scene: SCNScene(named: "Caneca.scn")
)
}

}
}

Também podemos criar nossa cena de outra forma:

struct ContentView: View {


var scene = SCNScene(named: "Caneca.scn")

var body: some View {
ZStack {
SceneView(
scene: scene
)
}

}
}

Dessa segunda forma temos mais controle sobre a scene antes dela ser instanciada na SceneView.

Do jeito que está agora o nosso preview está assim:

A nossa cena está toda preta porque estamos sem iluminação, portanto vamos adicionar algumas luzes! Para adicionar iluminação podemos criar duas variáveis uma do tipo SCNLight e outra do SCNNode. Possui alguns tipos de iluminação no SceneKit sendo elas: Ambiente, Spot, Omni, Directional, IES, Area e Probe. Aqui vou criar uma iluminação do tipo omni:

let light = SCNLight()
let lightNodeOmni: SCNNode = SCNNode()

E para configurar nossa luz e adicionar a cena, vou fazer no onApear da view:

}.onAppear{
light.type = .omni
light.castsShadow = true
light.temperature = 7000

lightNodeOmni.light = light
lightNodeOmni.position = SCNVector3(4, -10, 10)
lightNodeOmni.name = "Light-Omni"
scene!.rootNode.addChildNode(lightNodeOmni)

}

A nossa luz será do tipo omni, fará sombra e terá uma temperatura de 7000, este valor significa quão quente será a luz, portanto quanto mais quente mais amarelada será e quanto mais fria mais azulada.

Depois de configurar a temperatura da luz adicionamos ela no nosso nó ligthNodeOmni e posicionamos ele no espaço usando um SCNVector, que recebe 3 valores sendo eles respectivamente x,y,z.

E pronto! Agora nossa caneca está iluminada! Se achar necessário crie quantas fontes de iluminação quiser e posicione elas onde achar melhor:

Agora vamos fazer com que possamos mexer na cena e ver a nossa caneca de vários ângulos. Adicionando apenas um atributo na SceneView podemos mexer a nossa câmera:

SceneView(
scene: scene,
options: .allowsCameraControl
)

Parabéns! Agora você possui uma cena exportada do Blender no seu projeto do Xcode.

--

--