Introduction à la programmation 3D

en utilisant les technologies du Web

Fivos DOGANIS | Fivos.DOGANIS@3DS.com

Objectif

Comprendre

  • les mondes virtuels en ligne
  • les filtres de Réalité Augmentée (AR)

et créer les vôtres!

Rappels

Votre première page web (voir atelier sur les widgets)

  • du texte et des balises!
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Titre de la page</title>
  </head>
  <body>
    <header>L’entête : introduction au HTML (tag Header)</header>
    <h1>Un second titre mais avec la balise H1</h1>
    <!-- Ceci est un commentaire, ignoré par le navigateur -->
  </body>
</html>

Votre première page 3D avec A-Frame

Principe: des nouvelles balises!

Permettent de créer une page web 3D en moins de 20 lignes de code

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Hello, WebXR and A-Frame!</title>
    <meta name="description" content="Hello, WebVR! • A-Frame">
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene background="color: #ECECEC">
      <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9" shadow></a-box>
      <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E" shadow></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D" shadow></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4" shadow></a-plane>
    </a-scene>
  </body>
</html>

Modifions la scène

en haut à droite:
Change View > Editor View

  • Modifions les couleurs, comme expliqué ici
    • chaque couleur est définie par sa quantité de rouge, vert et bleu
    • ces valeurs vont de 0 à 255
      • en hexadécimal (base 16) on compte de 0 à 15, et on écrit
        0 1 2 3 4 5 6 7 8 9 A B C D E F
      • donc 0 s'écrit #00 et 255 s'écrit #FF
        • on ajoute un # pour distinguer un nombre hexadécimal


pour éviter les claculs, convertissez en ligne

  • ➡️ Coloriez le plan en rouge vif!

Modifions les objets 3D

position, orientation, taille

Position 3D

  • Comme en 2D

    • x pointe vers la droite
    • y pointe vers le haut
  • avec de la profondeur en plus

    • z pointe vers la caméra, donc vers vous
      • la caméra regarde vers les z négatifs

Modifions la position

  • ➡️ déplacez le cylindre vers la gauche
  • ➡️ déplacez le cube vers la haut
  • ➡️ déplacez la sphère vers le fond

Il suffit d'augmenter ou de diminuer x, y et z dans le code position="x y z"

Résultat

Rotation 3D

  • rotation en x : on tourne autour de l'axe x
  • rotation en y : on tourne autour de l'axe y
  • rotation en z : on tourne autour de l'axe z

Les angles sont en degrés

  • ➡️ faites tourner le cylindre autour de son axe x de 90 degrés pour le "coucher"
  • ➡️ faites tourner le cube autour de son axe y de 45 degrés pour le voir de face
  • ➡️ faites tourner le plan autour de son axe z pour le pencher

Il suffit d'augmenter ou de diminuer x, y et z (en degrés) dans le code rotation="x y z"

Chaque objet est transformé par rapport à son centre!

Résultat

Je m'ennuie quand est-ce qu'on joue?

Réalité augmentée

En modifiant une ligne de code!
(ou presque)
grâce à Jeeliz

A vous de jouer!

  • ➡️ Lancer Chrome (Firefox fonctionne mal pour cette activité)
  • ➡️ Allumez votre webcam
  • ➡️ Allez sur https://codepen.io/fivos/pen/rNWMgGo
  • ➡️ Mettez vous en plein écran
    • en haut à droite: Change View > Full Page View
  • ➡️ Faites une capture d'écran!

Fonctionnement

  • La librairie Jeeliz apporte des fonctionnlités de Réalité Augmentée
  • Dans <head>: on charge Jeeliz et une version modifiée de A-Frame
    <script src="https://jeeliz.com/demos/faceFilter/dist/jeelizFaceFilter.js"></script>
    <script src="https://jeeliz.com/demos/faceFilter/libs/aFrame/aframe-v0.8.2_modified.js"></script>
  • Inutile de retenir tout ça, c'est la suite qui est intéressante
  • Dans <body>: on crée un canvas pour dessiner la vidéo,
    on lance Jeeliz grâce onload="main()",
    et on indique quel objet bouger grâce à id="jeelizFaceFilterFollow", seul nouveau code dans notre scène!
  • ➡️ essayez de faire bouger la sphère également avec la tête
  <!-- Run 'main()' AR demo code when page loads -->
  <body onload="main()" style="color: white">
    <!-- Create a canvas to draw our augmented video -->
    <canvas width="600" height="600" id="jeeFaceFilterCanvas"></canvas>
    
    <!--
    Our A-Frame scene! 
    NOTE: Thanks to the new id "jeelizFaceFilterFollow" the cube will follow your face!
    -->
    <a-scene embedded>
      <a-box id="jeelizFaceFilterFollow" position="0 0 0" rotation="0 0 0" width="1" height="1" depth="1" color="#4CC3D9"></a-box>
      <a-sphere  position="0 1.25 -5" radius="0.5" color="#EF2D5E"></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.2" height="0.5" color="#FFC65D"></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
</a-scene>
  </body>

Y a pas autre chose que des cubes?

Texte en 3D

  • ➡️ Allez sur https://codepen.io/fivos/pen/PobGMaw
  • ➡️ Modifiez le code pour écrire un message
    • cherchez le texte "Hello WebXR!" dans la page
    • remplacez-le par votre message
  • ➡️ Faites une capture d'écran!
  • ➡️ Optionnel:
    • modifiez la couleur du texte avec un code hexadécimal
    • déplacez-le où vous voulez (position=...)
    • l'origine du repère (0, 0, 0) est entre vos yeux!

Je veux des lunettes!

et un chapeau,
un masque
etc.

Chargement de modèles 3D

  • ➡️ Allez sur https://codepen.io/fivos/pen/rNWMgdR

  • ➡️ Modifiez si vous voulez écrire un message

    • vous pouvez mettre un espace aussi ou juste ""
      • ou encore commenter la zone de texte avec <!-- -->
  • ➡️ Cherchez dans le code des modèles à ajouter à la scène

  • ➡️ Décommentez les lignes qui vous intéressent

    • supprimer <!-- et -->
  • ➡️ Faites des captures d'écran!

Félicitations! 🎉 Vous venez de recréer Snapchat AR 😄

Remarques

  • Chaque objet récupéré sur Google Poly ou Sketchfab a une échelle et une orientation différente!
    • l'objet "mustache" par exemple est 1 million de fois trop grand!
  • Il faut jouer avec les attributs position, rotation et scale pour les ajuster
    • scale permet d'agrandir ou de rétrécir un objet selon son axe x, y ou z

Comment ça marche?

Réalité augmentée

  • Traitement d'image
  • Machine Learning (IA)
    • réseaux de neurones
  • Estimation de la pose de la tête en 3D

Pour aller plus loin

  • Voir les exemples de la présentation 3D, AR, VR
    • envoyée lundi matin