SceneKit en Xamarin.iOS
SceneKit es una API de gráficos de escenas 3D que simplifica el trabajo con gráficos 3D. Se introdujo por primera vez en OS X 10.8 y ahora ha llegado a iOS 8. Con SceneKit creando visualizaciones 3D envolventes y juegos 3D casuales no requiere experiencia en OpenGL. Basándose en conceptos comunes de grafos de escena, SceneKit abstrae las complejidades de OpenGL y OpenGL ES, lo que facilita la adición de contenido 3D a una aplicación. Sin embargo, si es un experto en OpenGL, SceneKit también tiene un gran soporte para asociar directamente con OpenGL. También incluye numerosas características que complementan gráficos 3D, como las físicas, y se integra muy bien con otros marcos de Apple, como Core Animation, Core Image y Sprite Kit.
SceneKit es extremadamente fácil de usar. Es una API declarativa que se encarga del renderizado. Simplemente configura una escena, agrega propiedades a ella y SceneKit controla la representación de la escena.
Para trabajar con SceneKit, cree un grafo de escena mediante la SCNScene
clase. Una escena contiene una jerarquía de nodos, representada por instancias de SCNNode
, definiendo ubicaciones en espacio 3D. Cada nodo tiene propiedades como geometría, iluminación y materiales que afectan a su apariencia, como se muestra en la ilustración siguiente:
Crear una escena
Para que una escena aparezca en pantalla, se añade a una SCNView
asignándola a la propiedad Escena de la vista. Además, si realiza algún cambio en la escena, SCNView
se actualizará para mostrar los cambios.
scene = SCNScene.Create ();
sceneView = new SCNView (View.Frame);
sceneView.Scene = scene;
Las escenas se pueden rellenar a partir de archivos exportados a través de una herramienta de modelado 3D o mediante programación a partir de primitivos geométricos. Por ejemplo, esto es cómo crear una esfera y agregarla a la escena:
sphere = SCNSphere.Create (10.0f);
sphereNode = SCNNode.FromGeometry (sphere);
sphereNode.Position = new SCNVector3 (0, 0, 0);
scene.RootNode.AddChildNode (sphereNode);
Agregar luz
En este punto, la esfera no mostrará nada porque no hay ninguna luz en la escena. La asociación de SCNLight
instancias a los nodos crea luces en SceneKit. Hay varios tipos de luces que van desde varias formas de iluminación direccional hasta iluminación ambiente. Por ejemplo, el código siguiente crea una luz omnidireccional en el lado de la esfera:
// 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);
La iluminación omnidireccional produce un reflejo difuso que da lugar a una iluminación uniforme, algo así como iluminar con una linterna. La creación de luz ambiente es similar, aunque no tiene dirección, ya que brilla igual en todas las direcciones. Piense que es como la iluminación ambiental :)
// ambient light
ambientLight = SCNLight.Create ();
ambientLightNode = SCNNode.Create ();
ambientLight.LightType = SCNLightType.Ambient;
ambientLight.Color = UIColor.Purple;
ambientLightNode.Light = ambientLight;
scene.RootNode.AddChildNode (ambientLightNode);
Con las luces en su lugar, la esfera ahora está visible en la escena.
Agregar una cámara
Agregar una cámara (SCNCamera) a la escena cambia el punto de vista. El patrón para agregar la cámara es similar. Cree la cámara, adjunte a un nodo y agregue el nodo a la escena.
// camera
camera = new SCNCamera {
XFov = 80,
YFov = 80
};
cameraNode = new SCNNode {
Camera = camera,
Position = new SCNVector3 (0, 0, 40)
};
scene.RootNode.AddChildNode (cameraNode);
Como puede ver en el código anterior, los objetos SceneKit se pueden crear mediante constructores o desde el factory Method de Create. El primero permite usar la sintaxis del inicializador de C#, pero la que se va a usar es en gran medida una cuestión de preferencia.
Con la cámara en su lugar, toda la esfera es visible para el usuario:
También puede agregar luces adicionales a la escena. Este es el aspecto que tiene con algunas luces omnidireccionales adicionales:
Además, al establecer sceneView.AllowsCameraControl = true
, el usuario puede cambiar el punto de vista con un gesto táctil.
Materiales
Los materiales se crean con la clase SCNMaterial. Por ejemplo, para agregar una imagen a la superficie de la esfera, establezca la imagen en el contenido difuso delmaterial.
material = SCNMaterial.Create ();
material.Diffuse.Contents = UIImage.FromFile ("monkey.png");
sphere.Materials = new SCNMaterial[] { material };
Esta capa coloca la imagen en el nodo, como se muestra a continuación:
También se puede establecer un material para responder a otros tipos de iluminación. Por ejemplo, el objeto se puede hacer brillante y tener su contenido especular ajustado para mostrar la reflexión especular, lo que resulta en un punto brillante en la superficie, como se muestra a continuación:
Los materiales son muy flexibles, lo que le permite lograr mucho con muy poco código. Por ejemplo, en lugar de establecer la imagen en el contenido difuso, establézcala en el contenido reflectante en su lugar.
material.Reflective.Contents = UIImage.FromFile ("monkey.png");
Ahora el mono parece estar visualmente dentro de la esfera, independientemente del punto de vista.
Animación
SceneKit está diseñado para funcionar bien con animación. Puede crear animaciones implícitas o explícitas, e incluso representar una escena desde un árbol de capas de animación básica. Al crear una animación implícita, SceneKit proporciona su propia clase de transición, SCNTransaction
.
He aquí un ejemplo que hace girar la esfera:
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
sphereNode.Rotation = new SCNVector4 (0, 1, 0, (float)Math.PI * 4);
SCNTransaction.Commit ();
Sin embargo, puedes animar mucho más que la rotación. Muchas propiedades de SceneKit son animables. Por ejemplo, el código siguiente anima el material Shininess
para aumentar la reflexión especular.
SCNTransaction.Begin ();
SCNTransaction.AnimationDuration = 2.0;
material.Shininess = 0.1f;
SCNTransaction.Commit ();
SceneKit es muy sencillo de usar. Ofrece una gran cantidad de características adicionales, como restricciones, física, acciones declarativas, texto 3D, profundidad de compatibilidad con campos, integración del kit de Sprite y integración de Core Image, por nombrar solo algunas.