SceneKit v Xamarin.iOS
SceneKit je rozhraní API pro graf 3D scény, které zjednodušuje práci s 3D grafikou. Poprvé byla představena v OS X 10.8 a nyní přišla na iOS 8. Díky sadě SceneKit vytvářející imerzivní 3D vizualizace a neformální 3D hry nevyžadují odborné znalosti v OpenGL. Stavět na běžných konceptech grafu scény, SceneKit abstrahuje složitosti OpenGL a OpenGL ES, což usnadňuje přidání 3D obsahu do aplikace. Pokud jste však odborníkem na OpenGL, sceneKit má skvělou podporu pro přímé provádění s OpenGL. Zahrnuje také celou řadu funkcí, které doplňují 3D grafiku, jako je fyzika, a integruje se velmi dobře s několika dalšími architekturami Apple, jako je Core Animation, Core Image a Sprite Kit.
SceneKit je velmi snadné pracovat s. Jedná se o deklarativní rozhraní API, které se postará o vykreslování. Jednoduše nastavíte scénu, přidáte do ní vlastnosti a Sada SceneKit zpracuje vykreslování scény.
Pokud chcete pracovat se sceneKitem, vytvoříte graf scény pomocí SCNScene
třídy. Scéna obsahuje hierarchii uzlů reprezentovaných instancemi SCNNode
, definující umístění v 3D prostoru. Každý uzel má vlastnosti, jako je geometrie, osvětlení a materiály, které ovlivňují jeho vzhled, jak je znázorněno na následujícím obrázku:
Vytvoření scény
Pokud chcete, aby se scéna zobrazovala na obrazovce, přidáte ji do SCNView
vlastnosti Scéna zobrazení. Kromě toho, pokud provedete nějaké změny scény, aktualizuje se sám, SCNView
aby se změny zobrazily.
scene = SCNScene.Create ();
sceneView = new SCNView (View.Frame);
sceneView.Scene = scene;
Scény se dají naplnit ze souborů exportovaných prostřednictvím 3d nástroje pro modelování nebo programově z geometrických primitiv. Takto například vytvoříte sféru a přidáte ji do scény:
sphere = SCNSphere.Create (10.0f);
sphereNode = SCNNode.FromGeometry (sphere);
sphereNode.Position = new SCNVector3 (0, 0, 0);
scene.RootNode.AddChildNode (sphereNode);
Přidání světla
V tomto okamžiku sféra nic nezobrazí, protože ve scéně není žádné světlo. SCNLight
Připojení instancí k uzlům vytváří světla ve SceneKitu. Existuje několik typů světel od různých forem směrového osvětlení až po okolní osvětlení. Například následující kód vytvoří všesměrové světlo na straně koule:
// 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);
Všesměrové osvětlení vytváří difuzní odraz, který vede k rovnoměrnému osvětlení, jako je svítící baterka. Vytváření okolního světla je podobné, i když nemá žádný směr, protože svítí rovnoměrně ve všech směrech. Představte si to jako náladové osvětlení :)
// ambient light
ambientLight = SCNLight.Create ();
ambientLightNode = SCNNode.Create ();
ambientLight.LightType = SCNLightType.Ambient;
ambientLight.Color = UIColor.Purple;
ambientLightNode.Light = ambientLight;
scene.RootNode.AddChildNode (ambientLightNode);
S rozsvícenými světly je teď koule viditelná ve scéně.
Přidání Kamera
Přidání kamery (SCN Kamera) do scény změní úhel pohledu. Vzor pro přidání kamery je podobný. Vytvořte kameru, připojte ji k uzlu a přidejte uzel do scény.
// camera
camera = new SCNCamera {
XFov = 80,
YFov = 80
};
cameraNode = new SCNNode {
Camera = camera,
Position = new SCNVector3 (0, 0, 40)
};
scene.RootNode.AddChildNode (cameraNode);
Jak vidíte z výše uvedeného kódu, objekty SceneKit lze vytvořit pomocí konstruktorů nebo z metody Create factory. První z nich umožňuje používat syntaxi inicializátoru jazyka C#, ale kterou použít, je z velké části otázkou preference.
Když je kamera na místě, celá koule je viditelná pro uživatele:
Do scény můžete přidat i další světla. Takto to vypadá s několika více všesměrovými světly:
Kromě toho může uživatel nastavením sceneView.AllowsCameraControl = true
změnit úhel pohledu pomocí dotykového gesta.
Materiály
Materiály jsou vytvořeny pomocí třídy SCNMaterial. Pokud například chcete přidat obrázek na povrch sféry, nastavte obrázek na difúzní obsah materiálu.
material = SCNMaterial.Create ();
material.Diffuse.Contents = UIImage.FromFile ("monkey.png");
sphere.Materials = new SCNMaterial[] { material };
Tento obrázek se vrství do uzlu, jak je znázorněno níže:
Materiál lze nastavit tak, aby reagoval i na jiné typy osvětlení. Objekt může být například lesklý a má svůj specular obsah nastavený tak, aby zobrazoval spekulární odraz, což vede k jasnému místu na povrchu, jak je znázorněno níže:
Materiály jsou velmi flexibilní, což vám umožní dosáhnout hodně s velmi malým kódem. Například místo nastavení obrázku na difuzní obsah ho nastavte na reflexní obsah.
material.Reflective.Contents = UIImage.FromFile ("monkey.png");
Teď se opice zdá, že se vizuálně nachází v kouli, nezávisle na pohledu.
Animace
Sada SceneKit je navržená tak, aby dobře fungovala s animací. Můžete vytvořit implicitní i explicitní animace a dokonce můžete vykreslit scénu ze stromu základní animační vrstvy. Při vytváření implicitní animace, SceneKit poskytuje vlastní třídu přechodu , SCNTransaction
.
Tady je příklad, který otočí sféru:
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
sphereNode.Rotation = new SCNVector4 (0, 1, 0, (float)Math.PI * 4);
SCNTransaction.Commit ();
Animovat ale můžete mnohem víc, než je otočení. Mnoho vlastností SceneKitu je animatable. Například následující kód animuje materiál Shininess
, aby se zvýšila specifika odrazu.
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
material.Shininess = 0.1f;
SCNTransaction.Commit ();
Sada SceneKit je velmi jednoduchá k použití. Nabízí řadu dalších funkcí, včetně omezení, fyziky, deklarativních akcí, 3D textu, hloubkové podpory pole, integrace sady Sprite Kit a integrace Základní image, které můžete pojmenovat jen pár.