SCENEKIT¶
SceneKit è un framework di Apple che permette di creare, animare e renderizzare scene tridimensionali all'interno delle applicazioni iOS, macOS, watchOS e tvOS. Utilizzando SceneKit, gli sviluppatori possono costruire mondi 3D dettagliati e interattivi senza la necessità di conoscere complessi algoritmi di grafica.
Al centro di SceneKit ci sono le scene (SCNScene), che rappresentano l'insieme degli oggetti 3D, luci e telecamere. Ogni oggetto in una scena è rappresentato da un nodo (SCNNode), che può avere una posizione, una rotazione e una scala, e può contenere geometrie, luci o telecamere. SceneKit offre diverse geometrie predefinite come cubi, sfere e piani, ma permette anche di creare geometrie personalizzate utilizzando vertici, normali e texture.
Gli oggetti in SceneKit possono essere rivestiti con materiali (SCNMaterial), che definiscono l'aspetto visivo delle superfici, come colore, texture, riflessione e trasparenza. Inoltre, SceneKit supporta l'uso di shader personalizzati per effetti visivi avanzati. Le luci sono un elemento fondamentale per creare l'atmosfera delle scene 3D e SceneKit offre vari tipi di luci, come direzionali, omnidirezionali e spot, permettendo anche di generare ombre realistiche.
Le telecamere (SCNCamera) definiscono il punto di vista attraverso il quale la scena viene visualizzata e supportano funzionalità avanzate come la profondità di campo e gli effetti di post-elaborazione. SceneKit include un motore fisico per simulare dinamiche come collisioni e gravità, consentendo di aggiungere proprietà fisiche agli oggetti tramite SCNPhysicsBody.
Le animazioni sono un aspetto chiave di SceneKit, permettendo di animare le proprietà dei nodi come posizione, rotazione e scala. È possibile creare animazioni complesse utilizzando timeline, keyframe e azioni ripetute. SceneKit rende anche relativamente semplice l'integrazione con altre tecnologie Apple, come ARKit per la realtà aumentata, permettendo di combinare mondi 3D con il mondo reale.
Nel seguente esempio, viene creata una semplice scena, con un cubo animato che gira all’infinito e una luce.
import SceneKit
import UIKit
class ViewController: UIViewController {
var sceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
// Creazione della SCNView
sceneView = SCNView(frame: self.view.frame)
self.view.addSubview(sceneView)
// Creazione della scena
let scene = SCNScene()
// Creazione di un cubo
let box = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.0)
let material = SCNMaterial()
material.diffuse.contents = UIColor.blue
box.materials = [material]
// Creazione di un nodo per il cubo
let boxNode = SCNNode(geometry: box)
boxNode.position = SCNVector3(0, 0, -5)
scene.rootNode.addChildNode(boxNode)
// Creazione di una luce
let light = SCNLight()
light.type = .omni
light.color = UIColor.white
let lightNode = SCNNode()
lightNode.light = light
lightNode.position = SCNVector3(0, 10, 10)
scene.rootNode.addChildNode(lightNode)
// Animazione del cubo
let rotate = SCNAction.rotateBy(x: 0, y: CGFloat(2 * Double.pi), z: 0, duration: 5)
let repeatRotate = SCNAction.repeatForever(rotate)
boxNode.runAction(repeatRotate)
// Impostazione della scena nella SCNView
sceneView.scene = scene
sceneView.allowsCameraControl = true
sceneView.showsStatistics = true
sceneView.backgroundColor = UIColor.black
}
}