fundamentals.html 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>Principes fondamentaux</title>
  4. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  5. <meta name="twitter:card" content="summary_large_image">
  6. <meta name="twitter:site" content="@threejs">
  7. <meta name="twitter:title" content="Three.js – Principes fondamentaux">
  8. <meta property="og:image" content="https://threejs.org/files/share.png">
  9. <link rel="shortcut icon" href="../../files/favicon_white.ico" media="(prefers-color-scheme: dark)">
  10. <link rel="shortcut icon" href="../../files/favicon.ico" media="(prefers-color-scheme: light)">
  11. <link rel="stylesheet" href="../resources/lesson.css">
  12. <link rel="stylesheet" href="../resources/lang.css">
  13. <script type="importmap">
  14. {
  15. "imports": {
  16. "three": "../../build/three.module.js"
  17. }
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <div class="container">
  23. <div class="lesson-title">
  24. <h1>Principes fondamentaux</h1>
  25. </div>
  26. <div class="lesson">
  27. <div class="lesson-main">
  28. <p>Ceci est le premier article d'une série d'articles sur three.js.
  29. <a href="https://threejs.org">Three.js</a> est une bibliothèque 3D qui essaie de rendre
  30. aussi facile que possible l'affichage de contenu 3D sur une page web.</p>
  31. <p>Three.js est souvent confondu avec WebGL car la plupart du temps,
  32. mais pas toujours, three.js utilise WebGL pour dessiner en 3D.
  33. <a href="https://webglfundamentals.org">WebGL est un système de très bas niveau qui ne dessine que des points, des lignes et des triangles</a>.
  34. Pour faire quoi que ce soit d'utile avec WebGL, cela nécessite généralement beaucoup de
  35. code et c'est là que three.js intervient. Il gère des choses
  36. comme les scènes, les lumières, les ombres, les matériaux, les textures, les mathématiques 3D,
  37. toutes choses que vous auriez à écrire vous-même si vous utilisiez WebGL directement.</p>
  38. <p>Ces tutoriels supposent que vous connaissez déjà JavaScript et, pour la
  39. plupart, ils utiliseront le style ES6. <a href="prerequisites.html">Voir ici pour une
  40. liste concise des choses que vous êtes censé déjà connaître</a>.
  41. La plupart des navigateurs qui supportent three.js sont mis à jour automatiquement, donc la plupart des utilisateurs
  42. devraient pouvoir exécuter ce code. Si vous souhaitez faire fonctionner ce code
  43. sur de très vieux navigateurs, penchez-vous sur un transpiler comme <a href="https://babeljs.io">Babel</a>.
  44. Bien sûr, les utilisateurs qui exécutent de très vieux navigateurs ont probablement des machines
  45. qui ne peuvent pas exécuter three.js.</p>
  46. <p>Lors de l'apprentissage de la plupart des langages de programmation, la première chose que les gens
  47. font est de faire afficher <code class="notranslate" translate="no">"Hello World!"</code> par l'ordinateur. Pour la 3D,
  48. l'une des premières choses les plus courantes à faire est de créer un cube 3D.
  49. Alors commençons par "Hello Cube !"</p>
  50. <p>Avant de commencer, essayons de vous donner une idée de la structure
  51. d'une application three.js. Une application three.js vous demande de créer un tas
  52. d'objets et de les connecter ensemble. Voici un diagramme qui représente
  53. une petite application three.js</p>
  54. <div class="threejs_center"><img src="../resources/images/threejs-structure.svg" style="width: 768px;"></div>
  55. <p>Points à noter concernant le diagramme ci-dessus.</p>
  56. <ul>
  57. <li><p>Il y a un <a href="/docs/#api/en/constants/Renderer"><code class="notranslate" translate="no">Renderer</code></a>. C'est sans doute l'objet principal de three.js. Vous passez une
  58. <a href="/docs/#api/en/scenes/Scene"><code class="notranslate" translate="no">Scene</code></a> et une <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a> à un <a href="/docs/#api/en/constants/Renderer"><code class="notranslate" translate="no">Renderer</code></a> et il rend (dessine) la partie
  59. de la scène 3D qui se trouve à l'intérieur du <em>frustum</em> de la caméra en tant qu'image 2D sur un
  60. canevas.</p>
  61. </li>
  62. <li><p>Il y a un <a href="scenegraph.html">graphe de scène (scenegraph)</a> qui est une structure arborescente,
  63. composée de divers objets comme un objet <a href="/docs/#api/en/scenes/Scene"><code class="notranslate" translate="no">Scene</code></a>, plusieurs objets
  64. <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>, des objets <a href="/docs/#api/en/lights/Light"><code class="notranslate" translate="no">Light</code></a>, <a href="/docs/#api/en/objects/Group"><code class="notranslate" translate="no">Group</code></a>, <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a>, et des objets <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a>. Un
  65. objet <a href="/docs/#api/en/scenes/Scene"><code class="notranslate" translate="no">Scene</code></a> définit la racine du graphe de scène et contient des propriétés
  66. comme la couleur de fond et le brouillard. Ces objets définissent une structure arborescente
  67. hiérarchique parent/enfant et représentent où les objets apparaissent et comment ils sont
  68. orientés. Les enfants sont positionnés et orientés par rapport à leur parent. Par
  69. exemple, les roues d'une voiture pourraient être les enfants de la voiture de sorte que déplacer et
  70. orienter l'objet voiture déplace automatiquement les roues. Vous pouvez en savoir plus
  71. à ce sujet dans <a href="scenegraph.html">l'article sur les graphes de scène</a>.</p>
  72. <p>Notez dans le diagramme que la <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a> est à moitié dedans et à moitié dehors du graphe de scène. Cela représente
  73. qu'en three.js, contrairement aux autres objets, une <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a> n'a pas besoin
  74. d'être dans le graphe de scène pour fonctionner. Tout comme les autres objets, une <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a>, en tant
  75. qu'enfant d'un autre objet, se déplacera et s'orientera par rapport à son objet parent.
  76. Il y a un exemple de mise en place de plusieurs objets <a href="/docs/#api/en/cameras/Camera"><code class="notranslate" translate="no">Camera</code></a> dans un graphe de scène à
  77. la fin de <a href="scenegraph.html">l'article sur les graphes de scène</a>.</p>
  78. </li>
  79. <li><p>Les objets <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> représentent le dessin d'une <code class="notranslate" translate="no">Geometry</code> spécifique avec un
  80. <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> spécifique.</p>
  81. <p>Les objets <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> et les objets <code class="notranslate" translate="no">Geometry</code> peuvent être utilisés par
  82. plusieurs objets <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>. Par exemple, pour dessiner deux cubes bleus à différents
  83. endroits, nous aurions besoin de deux objets <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> pour représenter la position et
  84. l'orientation de chaque cube. Nous n'aurions besoin que d'une seule <code class="notranslate" translate="no">Geometry</code> pour stocker les
  85. données de sommet d'un cube et nous n'aurions besoin que d'un seul <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> pour spécifier la couleur
  86. bleue. Les deux objets <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> pourraient référencer le même objet <code class="notranslate" translate="no">Geometry</code> et le
  87. même objet <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a>.</p>
  88. </li>
  89. <li><p>Les objets <code class="notranslate" translate="no">Geometry</code> représentent les données de sommet d'une pièce de géométrie
  90. comme une sphère, un cube, un plan, un chien, un chat, un humain, un arbre, un bâtiment, etc...
  91. Three.js fournit de nombreux types de
  92. <a href="primitives.html">primitives de géométrie intégrées</a>. Vous pouvez également
  93. <a href="custom-buffergeometry.html">créer une géométrie personnalisée</a> ainsi que
  94. <a href="load-obj.html">charger de la géométrie à partir de fichiers</a>.</p>
  95. </li>
  96. <li><p>Les objets <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> représentent
  97. <a href="materials.html">les propriétés de surface utilisées pour dessiner la géométrie</a>
  98. y compris des choses comme la couleur à utiliser et à quel point elle est brillante. Un <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> peut
  99. également référencer un ou plusieurs objets <a href="/docs/#api/en/textures/Texture"><code class="notranslate" translate="no">Texture</code></a> qui peuvent être utilisés, par exemple,
  100. pour envelopper une image sur la surface d'une géométrie.</p>
  101. </li>
  102. <li><p>Les objets <a href="/docs/#api/en/textures/Texture"><code class="notranslate" translate="no">Texture</code></a> représentent généralement des images soit <a href="textures.html">chargées à partir de fichiers image</a>,
  103. <a href="canvas-textures.html">générées à partir d'un canevas</a>, soit <a href="rendertargets.html">rendues à partir d'une autre scène</a>.</p>
  104. </li>
  105. <li><p>Les objets <a href="/docs/#api/en/lights/Light"><code class="notranslate" translate="no">Light</code></a> représentent <a href="lights.html">différents types de lumières</a>.</p>
  106. </li>
  107. </ul>
  108. <p>Étant donné tout cela, nous allons créer la configuration *« Hello Cube »* la plus simple
  109. qui ressemble à ceci</p>
  110. <div class="threejs_center"><img src="../resources/images/threejs-1cube-no-light-scene.svg" style="width: 500px;"></div>
  111. <p>Tout d'abord, chargeons three.js</p>
  112. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="module"&gt;
  113. import * as THREE from 'three';
  114. &lt;/script&gt;
  115. </pre>
  116. <p>Il est important de mettre <code class="notranslate" translate="no">type="module"</code> dans la balise script. Cela nous permet
  117. d'utiliser le mot-clé <code class="notranslate" translate="no">import</code> pour charger three.js. À partir de r147, c'est la
  118. seule façon de charger properly three.js. Les modules ont l'avantage de pouvoir facilement
  119. importer d'autres modules dont ils ont besoin. Cela nous évite d'avoir à
  120. charger manuellement les scripts supplémentaires dont ils dépendent.</p>
  121. <p>Ensuite, nous avons besoin d'une balise <code class="notranslate" translate="no">&lt;canvas&gt;</code>, donc...</p>
  122. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;body&gt;
  123. &lt;canvas id="c"&gt;&lt;/canvas&gt;
  124. &lt;/body&gt;
  125. </pre>
  126. <p>Nous allons demander à three.js de dessiner dans ce canevas, nous devons donc le rechercher.</p>
  127. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="module"&gt;
  128. import * as THREE from 'three';
  129. +function main() {
  130. + const canvas = document.querySelector('#c');
  131. + const renderer = new THREE.WebGLRenderer({antialias: true, canvas});
  132. + ...
  133. &lt;/script&gt;
  134. </pre>
  135. <p>Après avoir trouvé le canevas, nous créons un <a href="/docs/#api/en/renderers/WebGLRenderer"><code class="notranslate" translate="no">WebGLRenderer</code></a>. Le renderer
  136. est la chose responsable de prendre toutes les données que vous fournissez
  137. et de les rendre sur le canevas.</p>
  138. <p>Notez qu'il y a quelques détails ésotériques ici. Si vous ne passez pas de canevas
  139. à three.js, il en créera un pour vous, mais vous devrez ensuite l'ajouter
  140. à votre document. L'endroit où l'ajouter peut changer en fonction de votre cas d'utilisation
  141. et vous devrez changer votre code. Je trouve que passer un canevas
  142. à three.js est un peu plus flexible. Je peux placer le canevas n'importe où
  143. et le code le trouvera, alors que si j'avais du code pour insérer le canevas
  144. dans le document, je devrais probablement changer ce code si mon cas d'utilisation changeait.</p>
  145. <p>Ensuite, nous avons besoin d'une caméra. Nous allons créer une <a href="/docs/#api/en/cameras/PerspectiveCamera"><code class="notranslate" translate="no">PerspectiveCamera</code></a>.</p>
  146. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const fov = 75;
  147. const aspect = 2; // the canvas default
  148. const near = 0.1;
  149. const far = 5;
  150. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  151. </pre>
  152. <p><code class="notranslate" translate="no">fov</code> est l'abréviation de <code class="notranslate" translate="no">field of view</code> (champ de vision). Dans ce cas, 75 degrés dans la dimension verticale.
  153. Notez que la plupart des angles en three.js sont en radians, mais pour une raison quelconque, la caméra perspective prend des degrés.</p>
  154. <p><code class="notranslate" translate="no">aspect</code> est le rapport d'aspect (display aspect) du canevas. Nous aborderons les détails
  155. <a href="responsive.html">dans un autre article</a> mais par défaut, un canevas est
  156. de 300x150 pixels, ce qui donne un rapport d'aspect de 300/150, soit 2.</p>
  157. <p><code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code> représentent l'espace devant la caméra
  158. qui sera rendu. Tout ce qui se trouve avant cette plage ou après cette plage
  159. sera écrêté (non dessiné).</p>
  160. <p>Ces quatre paramètres définissent un *« frustum »*.</p>
  161. <p>Un *frustum* est le nom d'une forme 3D qui ressemble à une pyramide dont la pointe est tranchée.</p>
  162. <p>En d'autres termes, considérez le mot "frustum" comme une autre forme 3D comme une sphère,
  163. un cube, un prisme, un frustum.</p>
  164. <p><img src="../resources/frustum-3d.svg" width="500" class="threejs_center"></p>
  165. <p>La hauteur des plans near et far est déterminée par le champ de vision.
  166. La largeur des deux plans est déterminée par le champ de vision et l'aspect.</p>
  167. <p>Tout ce qui se trouve à l'intérieur du frustum défini sera dessiné. Tout ce qui se trouve à l'extérieur
  168. ne le sera pas.</p>
  169. <p>La caméra est orientée par défaut vers l'axe -Z avec +Y vers le haut. Nous allons placer notre cube
  170. à l'origine, nous devons donc reculer légèrement la caméra par rapport à l'origine
  171. afin de voir quelque chose.</p>
  172. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">camera.position.z = 2;
  173. </pre>
  174. <p>Voici ce que nous visons.</p>
  175. <p><img src="../resources/scene-down.svg" width="500" class="threejs_center"></p>
  176. <p>Dans le diagramme ci-dessus, nous pouvons voir que notre caméra est à <code class="notranslate" translate="no">z = 2</code>. Elle regarde
  177. vers l'axe -Z. Notre frustum commence à 0.1 unité de l'avant de la caméra
  178. et va jusqu'à 5 unités devant la caméra. Parce que dans ce diagramme nous regardons vers le bas,
  179. le champ de vision est affecté par l'aspect. Notre canevas est deux fois plus large
  180. qu'il n'est haut, donc sur la largeur du canevas, le champ de vision sera beaucoup plus large que
  181. nos 75 degrés spécifiés, qui correspondent au champ de vision vertical.</p>
  182. <p>Ensuite, nous créons une <a href="/docs/#api/en/scenes/Scene"><code class="notranslate" translate="no">Scene</code></a>. Une <a href="/docs/#api/en/scenes/Scene"><code class="notranslate" translate="no">Scene</code></a> dans three.js est la racine d'une forme de graphe de scène.
  183. Tout ce que vous voulez que three.js dessine doit être ajouté à la scène. Nous allons
  184. couvrir plus de détails sur <a href="scenegraph.html">le fonctionnement des scènes dans un futur article</a>.</p>
  185. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  186. </pre>
  187. <p>Ensuite, nous créons une <a href="/docs/#api/en/geometries/BoxGeometry"><code class="notranslate" translate="no">BoxGeometry</code></a> qui contient les données pour une boîte.
  188. Presque tout ce que nous voulons afficher dans Three.js nécessite une géométrie qui définit
  189. les sommets qui composent notre objet 3D.</p>
  190. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const boxWidth = 1;
  191. const boxHeight = 1;
  192. const boxDepth = 1;
  193. const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
  194. </pre>
  195. <p>Nous créons ensuite un matériau de base et définissons sa couleur. Les couleurs peuvent
  196. être spécifiées en utilisant les valeurs hexadécimales à 6 chiffres de style CSS standard.</p>
  197. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const material = new THREE.MeshBasicMaterial({color: 0x44aa88});
  198. </pre>
  199. <p>Nous créons ensuite un <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>. Un <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> en three.js représente la combinaison
  200. de trois choses</p>
  201. <ol>
  202. <li>Une <code class="notranslate" translate="no">Geometry</code> (la forme de l'objet)</li>
  203. <li>Un <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a> (comment dessiner l'objet, brillant ou plat, quelle couleur, quelle(s) texture(s) appliquer. Etc.)</li>
  204. <li>La position, l'orientation et l'échelle de cet objet dans la scène par rapport à son parent. Dans le code ci-dessous, ce parent est la scène.</li>
  205. </ol>
  206. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const cube = new THREE.Mesh(geometry, material);
  207. </pre>
  208. <p>Et enfin, nous ajoutons ce maillage à la scène</p>
  209. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">scene.add(cube);
  210. </pre>
  211. <p>Nous pouvons ensuite rendre la scène en appelant la fonction de rendu du renderer
  212. et en lui passant la scène et la caméra</p>
  213. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">renderer.render(scene, camera);
  214. </pre>
  215. <p>Voici un exemple fonctionnel</p>
  216. <p></p><div translate="no" class="threejs_example_container notranslate">
  217. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fundamentals.html"></iframe></div>
  218. <a class="threejs_center" href="/manual/examples/fundamentals.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  219. </div>
  220. <p></p>
  221. <p>Il est un peu difficile de voir qu'il s'agit d'un cube 3D puisque nous le visualisons
  222. directement le long de l'axe -Z et que le cube lui-même est aligné sur les axes,
  223. donc nous ne voyons qu'une seule face.</p>
  224. <p>Animons-le en rotation et, espérons-le, cela montrera
  225. clairement qu'il est dessiné en 3D. Pour l'animer, nous allons le rendre dans une boucle de rendu en utilisant
  226. <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame"><code class="notranslate" translate="no">requestAnimationFrame</code></a>.</p>
  227. <p>Voici notre boucle</p>
  228. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function render(time) {
  229. time *= 0.001; // convert time to seconds
  230. cube.rotation.x = time;
  231. cube.rotation.y = time;
  232. renderer.render(scene, camera);
  233. requestAnimationFrame(render);
  234. }
  235. requestAnimationFrame(render);
  236. </pre>
  237. <p><code class="notranslate" translate="no">requestAnimationFrame</code> est une requête au navigateur indiquant que vous souhaitez animer quelque chose.
  238. Vous lui passez une fonction à appeler. Dans notre cas, cette fonction est <code class="notranslate" translate="no">render</code>. Le navigateur
  239. appellera votre fonction et si vous mettez à jour quoi que ce soit lié à l'affichage de la
  240. page, le navigateur re-rendrera la page. Dans notre cas, nous appelons la fonction
  241. <code class="notranslate" translate="no">renderer.render</code> de three, qui dessinera notre scène.</p>
  242. <p><code class="notranslate" translate="no">requestAnimationFrame</code> passe le temps écoulé depuis le chargement de la page
  243. à notre fonction. Ce temps est exprimé en millisecondes. Je trouve beaucoup
  244. plus facile de travailler avec des secondes, donc ici nous convertissons cela en secondes.</p>
  245. <p>Nous définissons ensuite les rotations X et Y du cube à l'heure actuelle. Ces rotations
  246. sont en <a href="https://en.wikipedia.org/wiki/Radian">radians</a>. Il y a 2 pi radians
  247. dans un cercle, donc notre cube devrait faire un tour sur chaque axe en environ 6,28
  248. secondes.</p>
  249. <p>Nous rendons ensuite la scène et demandons une autre frame d'animation pour continuer
  250. notre boucle.</p>
  251. <p>En dehors de la boucle, nous appelons <code class="notranslate" translate="no">requestAnimationFrame</code> une seule fois pour démarrer la boucle.</p>
  252. <p></p><div translate="no" class="threejs_example_container notranslate">
  253. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fundamentals-with-animation.html"></iframe></div>
  254. <a class="threejs_center" href="/manual/examples/fundamentals-with-animation.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  255. </div>
  256. <p></p>
  257. <p>C'est un peu mieux, mais il est toujours difficile de voir le 3D. Ce qui aiderait,
  258. c'est d'ajouter un peu d'éclairage, alors ajoutons une lumière. Il existe de nombreux types de lumières dans
  259. three.js que nous aborderons dans <a href="lights.html">un futur article</a>. Pour l'instant, créons une lumière directionnelle.</p>
  260. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  261. const intensity = 3;
  262. const light = new THREE.DirectionalLight(color, intensity);
  263. light.position.set(-1, 2, 4);
  264. scene.add(light);
  265. </pre>
  266. <p>Les lumières directionnelles ont une position et une cible. Les deux sont par défaut à 0, 0, 0. Dans notre
  267. cas, nous définissons la position de la lumière à -1, 2, 4, de sorte qu'elle est légèrement sur la gauche,
  268. au-dessus et derrière notre caméra. La cible est toujours 0, 0, 0, elle brillera donc
  269. vers l'origine.</p>
  270. <p>Nous devons également changer le matériau. Le <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a> n'est pas affecté par
  271. les lumières. Changeons-le pour un <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> qui est affecté par les lumières.</p>
  272. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">-const material = new THREE.MeshBasicMaterial({color: 0x44aa88}); // greenish blue
  273. +const material = new THREE.MeshPhongMaterial({color: 0x44aa88}); // greenish blue
  274. </pre>
  275. <p>Voici la structure de notre nouveau programme</p>
  276. <div class="threejs_center"><img src="../resources/images/threejs-1cube-with-directionallight.svg" style="width: 500px;"></div>
  277. <p>Et le voici en fonctionnement.</p>
  278. <p></p><div translate="no" class="threejs_example_container notranslate">
  279. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fundamentals-with-light.html"></iframe></div>
  280. <a class="threejs_center" href="/manual/examples/fundamentals-with-light.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  281. </div>
  282. <p></p>
  283. <p>Maintenant, il devrait être assez clairement en 3D.</p>
  284. <p>Juste pour le plaisir, ajoutons 2 cubes de plus.</p>
  285. <p>Nous utiliserons la même géométrie pour chaque cube mais créerons un matériau différent
  286. afin que chaque cube puisse avoir une couleur différente.</p>
  287. <p>Tout d'abord, nous allons créer une fonction qui crée un nouveau matériau
  288. avec la couleur spécifiée. Ensuite, elle crée un maillage en utilisant
  289. la géométrie spécifiée et l'ajoute à la scène et
  290. définit sa position en X.</p>
  291. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function makeInstance(geometry, color, x) {
  292. const material = new THREE.MeshPhongMaterial({color});
  293. const cube = new THREE.Mesh(geometry, material);
  294. scene.add(cube);
  295. cube.position.x = x;
  296. return cube;
  297. }
  298. </pre>
  299. <p>Ensuite, nous l'appellerons 3 fois avec 3 couleurs et positions X différentes
  300. en stockant les instances <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> dans un tableau.</p>
  301. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const cubes = [
  302. makeInstance(geometry, 0x44aa88, 0),
  303. makeInstance(geometry, 0x8844aa, -2),
  304. makeInstance(geometry, 0xaa8844, 2),
  305. ];
  306. </pre>
  307. <p>Enfin, nous allons faire tourner les 3 cubes dans notre fonction de rendu. Nous
  308. calculons une rotation légèrement différente pour chacun.</p>
  309. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function render(time) {
  310. time *= 0.001; // convert time to seconds
  311. cubes.forEach((cube, ndx) =&gt; {
  312. const speed = 1 + ndx * .1;
  313. const rot = time * speed;
  314. cube.rotation.x = rot;
  315. cube.rotation.y = rot;
  316. });
  317. ...
  318. </pre>
  319. <p>et voici le résultat.</p>
  320. <p></p><div translate="no" class="threejs_example_container notranslate">
  321. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fundamentals-3-cubes.html"></iframe></div>
  322. <a class="threejs_center" href="/manual/examples/fundamentals-3-cubes.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  323. </div>
  324. <p></p>
  325. <p>Si vous le comparez au diagramme vu de dessus ci-dessus, vous pouvez voir
  326. qu'il correspond à nos attentes.</p>
  327. <p>Avec les cubes à X = -2 et X = +2, ils sont partiellement en dehors de notre frustum.</p>
  328. <p>Ils sont également quelque peu exagérément déformés car le champ de vision
  329. à travers le canevas est si extrême.</p>
  330. <p>Notre programme a maintenant cette structure</p>
  331. <div class="threejs_center"><img src="../resources/images/threejs-3cubes-scene.svg" style="width: 610px;"></div>
  332. <p>Comme vous pouvez le voir, nous avons 3 objets <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>, chacun référençant la même <a href="/docs/#api/en/geometries/BoxGeometry"><code class="notranslate" translate="no">BoxGeometry</code></a>.
  333. Chaque <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> référence un <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> unique afin que chaque cube puisse avoir
  334. une couleur différente.</p>
  335. <p>J'espère que cette courte introduction vous aidera à démarrer. <a href="responsive.html">Ensuite, nous verrons
  336. comment rendre notre code réactif afin qu'il soit adaptable à plusieurs situations</a>.</p>
  337. <div id="es6" class="threejs_bottombar">
  338. <h3>modules es6, three.js et structure de dossiers</h3>
  339. <p>À partir de la version r147, la manière préférée d'utiliser three.js est via les <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import">modules es6</a> et les cartes d'importation (import maps).</p>
  340. <p>
  341. Les modules es6 peuvent être chargés via le mot-clé <code class="notranslate" translate="no">import</code> dans un script
  342. ou en ligne via une balise <code class="notranslate" translate="no">&lt;script type="module"&gt;</code>. Voici un exemple
  343. </p>
  344. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="module"&gt;
  345. import * as THREE from 'three';
  346. ...
  347. &lt;/script&gt;
  348. </pre>
  349. <p>
  350. Notez le spécificateur <code class="notranslate" translate="no">'three'</code> ici. Si vous le laissez tel quel, il produira probablement une erreur. Une *carte d'importation* doit être utilisée pour indiquer au navigateur où trouver three.js
  351. </p>
  352. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="importmap"&gt;
  353. {
  354. "imports": {
  355. "three": "./path/to/three.module.js"
  356. }
  357. }
  358. &lt;/script&gt;
  359. </pre>
  360. <p>
  361. Notez que le spécificateur de chemin ne peut commencer qu'avec <code class="notranslate" translate="no">./</code> ou <code class="notranslate" translate="no">../</code>.
  362. </p>
  363. <p>
  364. Pour importer des extensions (addons) comme <a href="https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/OrbitControls.js"><code class="notranslate" translate="no">OrbitControls.js</code></a>, utilisez ce qui suit
  365. </p>
  366. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">import {OrbitControls} from 'three/addons/controls/OrbitControls.js';
  367. </pre>
  368. <p>
  369. N'oubliez pas d'ajouter les extensions (addons) à la carte d'importation comme ceci
  370. </p>
  371. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="importmap"&gt;
  372. {
  373. "imports": {
  374. "three": "./path/to/three.module.js",
  375. "three/addons/": "./different/path/to/examples/jsm/"
  376. }
  377. }
  378. &lt;/script&gt;
  379. </pre>
  380. <p>
  381. Vous pouvez également utiliser un CDN
  382. </p>
  383. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;script type="importmap"&gt;
  384. {
  385. "imports": {
  386. "three": "https://cdn.jsdelivr.net/npm/three@&lt;version&gt;/build/three.module.js",
  387. "three/addons/": "https://cdn.jsdelivr.net/npm/three@&lt;version&gt;/examples/jsm/"
  388. }
  389. }
  390. &lt;/script&gt;
  391. </pre>
  392. <p>
  393. En conclusion, la manière recommandée d'utiliser three.js est
  394. </p>
  395. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">
  396. &lt;script type="importmap"&gt;
  397. {
  398. "imports": {
  399. "three": "./path/to/three.module.js",
  400. "three/addons/": "./different/path/to/examples/jsm/"
  401. }
  402. }
  403. &lt;/script&gt;
  404. &lt;script type="module"&gt;
  405. import * as THREE from 'three';
  406. import {OrbitControls} from 'three/addons/controls/OrbitControls.js';
  407. ...
  408. &lt;/script&gt;
  409. </pre>
  410. </div>
  411. <!-- needed in English only to prevent warning from outdated translations -->
  412. <p><a href="geometry.html"></a>
  413. <a href="Geometry"></a></p>
  414. </div>
  415. </div>
  416. </div>
  417. <script src="../resources/prettify.js"></script>
  418. <script src="../resources/lesson.js"></script>
  419. </body></html>
粤ICP备19079148号