SceneKit in Xamarin.iOS
SceneKit ist eine 3D-Szenendiagramm-API, die die Arbeit mit 3D-Grafiken vereinfacht. Es wurde erstmals in OS X 10.8 eingeführt und ist jetzt auf iOS 8 gekommen. Mit SceneKit erfordert das Erstellen immersiver 3D-Visualisierungen und gelegenheitsloser 3D-Spiele keine Kenntnisse in OpenGL. Basierend auf gängigen Szenendiagrammkonzepten abstrahiert SceneKit die Komplexität von OpenGL und OpenGL ES, sodass es sehr einfach ist, einer Anwendung 3D-Inhalte hinzuzufügen. Wenn Sie jedoch ein OpenGL-Experte sind, hat SceneKit auch eine hervorragende Unterstützung für die direkte Bindung an OpenGL. Es enthält auch zahlreiche Features, die 3D-Grafiken wie Physik ergänzen, und lässt sich sehr gut in mehrere andere Apple-Frameworks wie Core Animation, Core Image und Sprite Kit integrieren.
SceneKit ist äußerst einfach zu bedienen. Es handelt sich um eine deklarative API, die das Rendern übernimmt. Sie richten einfach eine Szene ein, fügen ihr Eigenschaften hinzu, und SceneKit übernimmt das Rendern der Szene.
Um mit SceneKit zu arbeiten, erstellen Sie mithilfe der SCNScene
-Klasse ein Szenendiagramm. Eine Szene enthält eine Hierarchie von Knoten, dargestellt durch Instanzen von SCNNode
, die Standorte im 3D-Raum definieren. Jeder Knoten verfügt über Eigenschaften wie Geometrie, Beleuchtung und Materialien, die sich auf sein Aussehen auswirken, wie in der folgenden Abbildung dargestellt:
Erstellen einer Szene
Damit eine Szene auf dem Bildschirm angezeigt wird, fügen Sie sie einer SCNView
hinzu, indem Sie sie der Scene-Eigenschaft der Ansicht zuweisen. Wenn Sie Änderungen an der Szene vornehmen, aktualisiert sich außerdem selbst, SCNView
um die Änderungen anzuzeigen.
scene = SCNScene.Create ();
sceneView = new SCNView (View.Frame);
sceneView.Scene = scene;
Szenen können aus Dateien aufgefüllt werden, die über ein 3D-Modellierungstool exportiert werden, oder programmgesteuert aus geometrischen Grundtypen. So erstellen Sie beispielsweise eine Kugel und fügen sie der Szene hinzu:
sphere = SCNSphere.Create (10.0f);
sphereNode = SCNNode.FromGeometry (sphere);
sphereNode.Position = new SCNVector3 (0, 0, 0);
scene.RootNode.AddChildNode (sphereNode);
Hinzufügen von Licht
An diesem Punkt zeigt die Kugel nichts an, da es kein Licht in der Szene gibt. Durch das Anfügen von SCNLight
Instanzen an Knoten werden Lichter in SceneKit erzeugt. Es gibt verschiedene Arten von Lichtern, die von verschiedenen Formen der direktionalen Beleuchtung bis hin zur Umgebungsbeleuchtung reichen. Der folgende Code erstellt beispielsweise ein omnidirektionales Licht auf der Seite der Kugel:
// 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);
Omnidirektionale Beleuchtung erzeugt eine diffuse Reflexion, die zu einer gleichmäßigen Beleuchtung führt, wie eine Taschenlampe. Das Erzeugen von Umgebungslicht ist ähnlich, obwohl es keine Richtung hat, da es in alle Richtungen gleichermaßen leuchtet. Denken Sie daran wie Stimmungsbeleuchtung :)
// ambient light
ambientLight = SCNLight.Create ();
ambientLightNode = SCNNode.Create ();
ambientLight.LightType = SCNLightType.Ambient;
ambientLight.Color = UIColor.Purple;
ambientLightNode.Light = ambientLight;
scene.RootNode.AddChildNode (ambientLightNode);
Wenn die Lichter an Ort und Stelle sind, ist die Kugel jetzt in der Szene sichtbar.
Hinzufügen einer Kamera
Durch das Hinzufügen einer Kamera (SCNCamera) zur Szene wird der Standpunkt geändert. Das Muster zum Hinzufügen der Kamera ist ähnlich. Erstellen Sie die Kamera, fügen Sie sie an einen Knoten an, und fügen Sie den Knoten der Szene hinzu.
// camera
camera = new SCNCamera {
XFov = 80,
YFov = 80
};
cameraNode = new SCNNode {
Camera = camera,
Position = new SCNVector3 (0, 0, 40)
};
scene.RootNode.AddChildNode (cameraNode);
Wie Sie im obigen Code sehen können, können SceneKit-Objekte mithilfe von Konstruktoren oder über die Create Factory-Methode erstellt werden. Erstere ermöglicht die Verwendung der C#-Initialisierersyntax, aber welche verwendet werden soll, ist größtenteils eine Frage der Präferenz.
Wenn die Kamera vorhanden ist, ist die gesamte Kugel für den Benutzer sichtbar:
Sie können der Szene auch zusätzliche Lichter hinzufügen. So sieht es mit ein paar mehr omnidirektionalen Leuchten aus:
Darüber hinaus kann der Benutzer durch festlegen sceneView.AllowsCameraControl = true
den Standpunkt mit einer Touchbewegung ändern.
Materialien
Materialien werden mit der SCNMaterial-Klasse erstellt. Um beispielsweise ein Bild auf der Oberfläche der Kugel hinzuzufügen, legen Sie das Bild auf den diffusen Inhalt des Materials fest.
material = SCNMaterial.Create ();
material.Diffuse.Contents = UIImage.FromFile ("monkey.png");
sphere.Materials = new SCNMaterial[] { material };
Dadurch wird das Bild wie unten dargestellt auf den Knoten übertragen:
Ein Material kann so eingestellt werden, dass es auch auf andere Arten von Beleuchtung reagiert. Beispielsweise kann das Objekt glänzend gemacht werden und sein Spiegelinhalt so festgelegt werden, dass er eine Spiegelung anzeigt, was zu einem hellen Fleck auf der Oberfläche führt, wie unten gezeigt:
Materialien sind sehr flexibel, sodass Sie mit sehr wenig Code viel erreichen können. Anstatt das Bild beispielsweise auf den diffusen Inhalt festzulegen, legen Sie es stattdessen auf den reflektierenden Inhalt fest.
material.Reflective.Contents = UIImage.FromFile ("monkey.png");
Nun scheint der Affe visuell in der Sphäre zu sitzen, unabhängig vom Standpunkt.
Animation
SceneKit wurde entwickelt, um gut mit Animationen zu funktionieren. Sie können sowohl implizite als auch explizite Animationen erstellen und sogar eine Szene aus einer Kernanimationsschichtstruktur rendern. Beim Erstellen einer impliziten Animation stellt SceneKit eine eigene Übergangsklasse bereit, SCNTransaction
.
Hier sehen Sie ein Beispiel, das die Kugel rotiert:
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
sphereNode.Rotation = new SCNVector4 (0, 1, 0, (float)Math.PI * 4);
SCNTransaction.Commit ();
Sie können jedoch viel mehr als nur die Drehung animieren. Viele Eigenschaften von SceneKit sind animatable. Der folgende Code animiert beispielsweise die des Shininess
Materials, um die Spiegelung zu erhöhen.
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
material.Shininess = 0.1f;
SCNTransaction.Commit ();
SceneKit ist sehr einfach zu verwenden. Es bietet eine Vielzahl zusätzlicher Features wie Einschränkungen, Physik, deklarative Aktionen, 3D-Text, Tiefenschärfeunterstützung, Sprite Kit-Integration und Core Image-Integration, um nur einige zu nennen.