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.