Sdílet prostřednictvím


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:

The SceneKit hierarchy

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ě.

The sphere is visible in the scene when lit

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:

The entire sphere is visible to the user

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:

The sphere with a few more omnidirectional lights

Kromě toho může uživatel nastavením sceneView.AllowsCameraControl = truezmě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:

Layering the image onto the sphere

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:

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

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.