Condividi tramite


SceneKit in Xamarin.iOS

SceneKit è un'API grafico della scena 3D che semplifica l'uso della grafica 3D. È stato introdotto per la prima volta in OS X 10.8 e ora è arrivato a iOS 8. Con SceneKit che crea visualizzazioni 3D immersive e giochi 3D casuali non richiede competenze in OpenGL. Basandosi sui concetti comuni del grafico della scena, SceneKit astrae le complessità di OpenGL e OpenGL ES, semplificando l'aggiunta di contenuto 3D a un'applicazione. Tuttavia, se sei un esperto openGL, SceneKit ha un ottimo supporto per legarsi direttamente con OpenGL. Include anche numerose funzionalità che integrano la grafica 3D, come la fisica, e si integra molto bene con diversi altri framework Apple, ad esempio Animazione core, Core Image e Sprite Kit.

SceneKit è estremamente facile da usare. Si tratta di un'API dichiarativa che si occupa del rendering. È sufficiente configurare una scena, aggiungervi proprietà e SceneKit gestisce il rendering della scena.

Per usare SceneKit, creare un grafo della scena usando la SCNScene classe . Una scena contiene una gerarchia di nodi, rappresentata da istanze di SCNNode, che definiscono le posizioni nello spazio 3D. Ogni nodo ha proprietà come geometria, illuminazione e materiali che ne influiscono sull'aspetto, come illustrato nella figura seguente:

The SceneKit hierarchy

Creare una scena

Per visualizzare una scena sullo schermo, aggiungerla a un oggetto SCNView assegnandola alla proprietà Scene della visualizzazione. Inoltre, se si apportano modifiche alla scena, SCNView si aggiornerà per visualizzare le modifiche.

scene = SCNScene.Create ();
sceneView = new SCNView (View.Frame);
sceneView.Scene = scene;

Le scene possono essere popolate da file esportati tramite uno strumento di modellazione 3d o a livello di codice da primitive geometriche. Ad esempio, si tratta di come creare una sfera e aggiungerla alla scena:

sphere = SCNSphere.Create (10.0f);
sphereNode = SCNNode.FromGeometry (sphere);
sphereNode.Position = new SCNVector3 (0, 0, 0);
scene.RootNode.AddChildNode (sphereNode);

Aggiunta di luce

A questo punto la sfera non visualizzerà nulla perché non c'è luce nella scena. Il collegamento di SCNLight istanze ai nodi crea luci in SceneKit. Ci sono diversi tipi di luci che vanno da varie forme di illuminazione direzionale all'illuminazione ambientale. Ad esempio, il codice seguente crea una luce omnidirectionale sul lato della sfera:

// omnidirectional light
var light = SCNLight.Create ();
var lightNode = SCNNode.Create ();
light.LightType = SCNLightType.Omni;
light.Color = UIColor.Blue;
lightNode.Light = light;
lightNode.Position = new SCNVector3 (-40, 40, 60);
scene.RootNode.AddChildNode (lightNode);

L'illuminazione omnidirectionale produce un riflesso diffuso che comporta un'illuminazione uniforme, come la luce di una torcia. La creazione di luce ambientale è simile, anche se non ha direzione come brilla ugualmente in tutte le direzioni. Pensaci come l'illuminazione dell'umore :)

// ambient light
ambientLight = SCNLight.Create ();
ambientLightNode = SCNNode.Create ();
ambientLight.LightType = SCNLightType.Ambient;
ambientLight.Color = UIColor.Purple;
ambientLightNode.Light = ambientLight;
scene.RootNode.AddChildNode (ambientLightNode);

Con le luci sul posto, la sfera è ora visibile nella scena.

The sphere is visible in the scene when lit

Aggiunta di un Fotocamera

L'aggiunta di una fotocamera (SCN Fotocamera) alla scena cambia il punto di vista. Il modello per aggiungere la fotocamera è simile. Creare la fotocamera, collegarla a un nodo e aggiungere il nodo alla scena.

// camera
camera = new SCNCamera {
    XFov = 80,
    YFov = 80
};
cameraNode = new SCNNode {
    Camera = camera,
    Position = new SCNVector3 (0, 0, 40)
};
scene.RootNode.AddChildNode (cameraNode);

Come si può vedere dal codice precedente, gli oggetti SceneKit possono essere creati usando costruttori o dal metodo Create factory. Il primo consente l'uso della sintassi dell'inizializzatore C#, ma quello da usare è in gran parte una questione di preferenza.

Con la fotocamera sul posto, l'intera sfera è visibile all'utente:

The entire sphere is visible to the user

È anche possibile aggiungere luci aggiuntive alla scena. Ecco come appare con alcune luci omnidirectionali:

The sphere with a few more omnidirectional lights

Inoltre, impostando sceneView.AllowsCameraControl = true, l'utente può modificare il punto di visualizzazione con un movimento di tocco.

Materiali

I materiali vengono creati con la classe SCNMaterial. Ad esempio, per aggiungere un'immagine sulla superficie della sfera, impostare l'immagine sul contenuto diffuso del materiale.

material = SCNMaterial.Create ();
material.Diffuse.Contents = UIImage.FromFile ("monkey.png");
sphere.Materials = new SCNMaterial[] { material };

Questa immagine viene a livelli sul nodo, come illustrato di seguito:

Layering the image onto the sphere

Un materiale può essere impostato per rispondere anche ad altri tipi di illuminazione. Ad esempio, l'oggetto può essere reso lucido e il relativo contenuto speculare è impostato per visualizzare la reflection speculare, ottenendo un punto luminoso sulla superficie, come illustrato di seguito:

The object made shiny with specular reflection, resulting in a bright spot on the surface

I materiali sono molto flessibili, consentendo di ottenere molto con pochissimo codice. Ad esempio, anziché impostare l'immagine sul contenuto diffuso, impostarla sul contenuto riflettente.

material.Reflective.Contents = UIImage.FromFile ("monkey.png");

Ora la scimmia sembra sedersi visivamente all'interno della sfera, indipendentemente dal punto di vista.

Animazione

SceneKit è progettato per funzionare bene con l'animazione. È possibile creare animazioni implicite o esplicite e persino eseguire il rendering di una scena da un albero del livello Animazione principale. Quando si crea un'animazione implicita, SceneKit fornisce la propria classe di transizione, SCNTransaction.

Ecco un esempio che ruota la sfera:

SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
sphereNode.Rotation = new SCNVector4 (0, 1, 0, (float)Math.PI * 4);
SCNTransaction.Commit ();

Puoi animare molto di più della rotazione. Molte proprietà di SceneKit sono animabili. Ad esempio, il codice seguente anima il materiale Shininess per aumentare la reflection speculare.

SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
material.Shininess = 0.1f;
SCNTransaction.Commit ();

SceneKit è molto semplice da usare. Offre un'ampia gamma di funzionalità aggiuntive, tra cui vincoli, fisica, azioni dichiarative, testo 3D, profondità del supporto dei campi, integrazione di Sprite Kit e integrazione di Core Image per citarne solo alcuni.