SceneKit: écrire un mot sur chaque face d'un cube
Je peux t'aider avec Scene Kit, j'en ai une grosse expérience.
Je vais profiter de cette magnifique expérience pour poser une petite question que tu vas surement trouvé trivial.
Est il possible sur un cube (par exemple), d'écrire un mot (genre de coller un label) sur chaque face ? ::)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est plutôt simple. J'arrive à comprendre, sans avoir jamais fait de SceneKit, grâce à ma petite expérience de SpriteKit.
Et avec Metal ?
Cela ne répond pas vraiment à la question de Jérémy, qui veut coller des labels sur le cube. Enfin il peut toujours dessiner le texte dans un contexte graphique, pour générer une UIImage et l'utiliser comme texture.
On peut aussi mettre dans la propriété contents:
- une CALayer
- une CGImage
- une SKScene
- une autre SCNScene rendue dans une SCNLayer
Mais ce n'est pas classique comme manière de faire en 3D, habituellement les textures sont toutes prêtes.
Oui, mais on a besoin d'afficher du texte à la volée dans un jeu, ne serais-ce que "Score : 12356"
Le protocole SCNSceneRenderer auquel se conforme SCNView a une propriété overlaySKScene. C'est la manière idéale d'afficher un score.
Ah oui, c'est intéressant. On peut donc placer une couche SpriteKit (affichage de textes et interface 2D) au dessus la scène 3D. Très utile ..
Tu peux choisir le moteur ? Si oui, tu fais comment ?
+1
Si je comprends bien je crée un rendu avec SpriteKit que je viens coller sur mon cube ? Et du coup je vois pouvoir changer le texte à la volée ?
Oui, c'est cela, mais je parle de deux choses différentes. overlaySKScene recouvre forcément toute la vue. ça sert typiquement à afficher un score, ou une barre de vie.
Pour changer l'image sur le cube, c'est la propriété .contents où tu peux utiliser une SKScene (parmi d'autres possibilités).
Il suffit donc de placer un SKLabel sur la SKScene pour afficher un texte directement sur le cube. Je ferais un essai ce soir pour voir.
Tu as trouvé qu'il y en avait de mieux que l'autre ? Si tu fais le ration qualité graphique sur consommation énergétique.
Playground permet il de faire des protos de Scene/Sprite Kit ?
Si tu pouvais poster ta solution ce serait super sympa.
D'accord ! Ouai j'imagine que les retours d'expérience de Metal ne doivent pas courir les rues... Mise à part ça, elle te semble mature comme techno ?
C'était inutilisable il y a seulement un an.
Pour l'instant, il n'y a pas encore de gros jeux qui l'exploitent, ni d'autres gros logiciels. ça devrait arriver bientôt. De ce que j'en ai lu, il y a encore un tas de problèmes, qui ne nous concernent pas forcément à notre petit niveau.
Pour réaliser cet essai, j'ai utilisé le template SceneKit d'Xcode en le simplifiant. Je n'ai modifié que la méthode viewDidLoad() du GameViewController. Et importé le framework SpriteKit.
La seule chose que j'ai reprise du viewDidLoad() du template, c'est la gesture de la caméra et sa gestion (je ne comprend rien à SCNTransaction et compagnie).
a
a
J'ai ... presque réussi ! Grrrr ..
Pour une raison qui m'échappe, le texte du SKLabel est inversé !
Enfin, pour la première fois que je touche SceneKit c'est pas si mal.
Bon, j'ai réglé le problème en inversant verticalement le label.
Ouf !
Etape suivante : afficher un texte différent sur chaque face.
Pour ce faire, il faut créer des objets matériaux (SCNMaterial) et les associer à chaque face du cube.
Pour me simplifier la vie, j'ai écrit une fonction créant automatiquement un matériau à partir d'un texte.
a
Création des 6 matériaux
Dernière étape : donner la liste des matériaux au cube
Le résultat n'est pas encore parfait. Les textes trop longs comme "SAUMON" et "WASABI" débordent sur les bords. Mais c'est facile à régler, en ajustant la taille de la police pour chaque face.
Je ne suis pas mécontent de ces petits essais. Finalement SceneKit n'est pas aussi compliqué que je l'avais imaginé.
Il existe les SCNActions qui font la même chose, mais bien plus simplement, et avec lesquelles je n'ai jamais eu le moindre problème. ça fonctionne comme les SKActions, donc tu seras en terrain connu.
On peut écrire scene.playing = true, ou un truc comme ça pour forcer le rafraà®chissement.
Parfait, donc SCNTransaction.
J'avais vu les SCNActions dans le template SceneKit. C'est super d'avoir l'équivalent des SKActions en 3D.
Il faut donc activer le rafraà®chissement avant de lancer une SKAction sur une SKScene de l'objet.
Pour moi, le problème c'est qu'il y a beaucoup de limitations, qu'elles ne sont pas clairement documentées, et le tout est très loin de la magie revendiquée par Apple. Technologiquement parlant, Scene Kit sera toujours cinq ans derrière Unity ou Unreal. Je ne comprends pas bien la volonté de leur courir après.
Pour une représentation 3D simple, c'est très bien, mais vouloir faire un jeu avec " un tant soit peu complexe " est stupide.
DOUBLON A EFFACER !
Quelques émois, et hop .. voici un dés magique pour la Saint Valentin :
(attention de ne pas tomber sur la dernière face !)
Beau travail Draken !
Mais tu coup est il possible de changer le texte à la volé si le cube est en mouvement (exemple, afficher l'heure en temps réel sur une des faces) ?
Je pense (à tester) qu'on peut actualiser le cube toutes les secondes en créant un nouveau matériau avec l'heure courante, pour l'affecter à la bonne face.
Un truc comme :
En fait le cube peut actualiser lui même son contenu, grâce à l'action SCNAction.customAction() permettant d'exécuter régulièrement un bloc d'instructions, avec un délai variable.
Je ferai un essai demain, là dodo ..
EDIT : Oups, je me suis trompé, l'action SCNAction.customAction() ne fonctionne pas comme je le pensais, à la première lecture. En fait, elle répète les mêmes instructions pendant une durée de temps précise.
Et voilà , j'ai modifié le code pour afficher en permanence la valeur d'un compteur s'incrémentant une fois par seconde.
a
a
Le compteur est une variable du GameViewControleur.
a
a
L'idée est d'associer une action personnalisé au cube. Celle-ci se compose d'une répétition sans fin, d'une attente d'une seconde et de quelques instructions pour incrémenter le compteur, créer un nouveau matériau et actualiser une face du cube.
a
La preuve en image :
Ah chouette !
Si souhaites intégrer ton cube dans une application existante et que tu veuilles qu'il n'y ait pas de fond noir (pas de fond du tout), j'imagine que c'est possible ?
Tu veux placer une vue classique sous la sceneView, pour avoir une superposition ? Je présume que c'est réalisable avec remplissant le fond de la scène avec la couleur transparente. Je dois filer, je ferai un essai plus tard.