Partager via


SceneKit dans Xamarin.iOS

SceneKit est une API de graphique de scène 3D qui simplifie l’utilisation de graphiques 3D. Il a été introduit pour la première fois dans OS X 10.8 et est maintenant disponible sur iOS 8. Avec SceneKit, la création de visualisations 3D immersives et de jeux 3D occasionnels ne nécessite pas d’expertise en OpenGL. En s’appuyant sur les concepts courants du graphique de scène, SceneKit extrait les complexités d’OpenGL et d’OpenGL ES, ce qui facilite l’ajout de contenu 3D à une application. Toutefois, si vous êtes un expert OpenGL, SceneKit offre également un excellent support pour la liaison directe avec OpenGL. Il comprend également de nombreuses fonctionnalités qui complètent les graphiques 3D, tels que la physique, et s’intègre très bien à plusieurs autres frameworks Apple, tels que Core Animation, Core Image et Sprite Kit.

SceneKit est extrêmement facile à utiliser. Il s’agit d’une API déclarative qui prend en charge le rendu. Il vous suffit de configurer une scène, d’y ajouter des propriétés et SceneKit gère le rendu de la scène.

Pour utiliser SceneKit, vous créez un graphique de scène à l’aide de la SCNScene classe . Une scène contient une hiérarchie de nœuds, représentées par des instances de SCNNode, définissant des emplacements dans un espace 3D. Chaque nœud a des propriétés telles que la géométrie, l’éclairage et les matériaux qui affectent son apparence, comme illustré par la figure suivante :

Hiérarchie SceneKit

Créer une scène

Pour qu’une scène apparaisse à l’écran, vous l’ajoutez à un SCNView en l’affectant à la propriété Scene de l’affichage. En outre, si vous apportez des modifications à la scène, SCNView se met à jour pour afficher les modifications.

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

Les scènes peuvent être remplies à partir de fichiers exportés via un outil de modélisation 3D ou par programmation à partir de primitives géométriques. Par exemple, voici comment créer une sphère et l’ajouter à la scène :

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

Ajout de la lumière

À ce stade, la sphère n’affichera rien, car il n’y a pas de lumière dans la scène. L’attachement d’instances SCNLight à des nœuds crée des lumières dans SceneKit. Il existe plusieurs types de lumières allant de différentes formes d’éclairage directionnel à l’éclairage ambiant. Par exemple, le code suivant crée une lumière omnidirectionnelle sur le côté de la sphère :

// 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’éclairage omnidirectionnel produit une réflexion diffuse qui se traduit par un éclairage homogène, un peu comme une lampe de poche. La création de lumière ambiante est similaire, bien qu’elle n’ait aucune direction, car elle brille également dans toutes les directions. Pensez-y comme un éclairage d’ambiance :)

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

Une fois les lumières en place, la sphère est désormais visible dans la scène.

La sphère est visible dans la scène lorsqu’elle est allumée

Ajout d’une caméra

L’ajout d’une caméra (SCNCamera) à la scène change le point de vue. Le modèle à ajouter à l’appareil photo est similaire. Créez la caméra, attachez-la à un nœud et ajoutez le nœud à la scène.

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

Comme vous pouvez le voir dans le code ci-dessus, les objets SceneKit peuvent être créés à l’aide de constructeurs ou de la méthode Create factory. Le premier permet d’utiliser la syntaxe d’initialiseur C#, mais celui à utiliser est en grande partie une question de préférence.

Une fois la caméra en place, la sphère entière est visible par l’utilisateur :

La sphère entière est visible par l’utilisateur

Vous pouvez également ajouter des lumières supplémentaires à la scène. Voici à quoi il ressemble avec quelques lumières omnidirectionnelles supplémentaires :

La sphère avec quelques lumières plus omnidirectionnelles

En outre, en définissant sceneView.AllowsCameraControl = true, l’utilisateur peut modifier le point de vue avec un mouvement tactile.

Matériaux

Les matériaux sont créés avec la classe SCNMaterial. Par exemple, pour ajouter une image à la surface de la sphère, définissez l’image sur le contenu diffus du matériau.

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

Cette opération couche l’image sur le nœud, comme indiqué ci-dessous :

Superposition de l’image sur la sphère

Un matériau peut également être configuré pour répondre à d’autres types d’éclairage. Par exemple, l’objet peut être rendu brillant et avoir son contenu spéculaire défini pour afficher la réflexion spéculaire, ce qui entraîne un point lumineux sur la surface, comme indiqué ci-dessous :

L’objet est rendu brillant avec réflexion spéculaire, ce qui donne un point lumineux sur la surface

Les matériaux sont très flexibles, ce qui vous permet d’obtenir beaucoup avec très peu de code. Par exemple, au lieu de définir l’image sur le contenu diffus, définissez-la plutôt sur le contenu réfléchissant.

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

Maintenant, le singe semble s’asseoir visuellement dans la sphère, indépendamment du point de vue.

Animation

SceneKit est conçu pour fonctionner correctement avec l’animation. Vous pouvez créer des animations implicites ou explicites et même afficher une scène à partir d’une arborescence de couche Animation principale. Lors de la création d’une animation implicite, SceneKit fournit sa propre classe de transition, SCNTransaction.

Voici un exemple qui fait pivoter la sphère :

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

Vous pouvez toutefois animer bien plus que la rotation. De nombreuses propriétés de SceneKit sont animatables. Par exemple, le code suivant anime le matériau pour Shininess augmenter la réflexion spéculaire.

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

SceneKit est très simple à utiliser. Il offre une multitude de fonctionnalités supplémentaires, notamment les contraintes, la physique, les actions déclaratives, le texte 3D, la prise en charge de la profondeur du champ, l’intégration sprite Kit et l’intégration de Core Image, pour n’en nommer que quelques-unes.