1
0

primitives.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>Primitives</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 – Primitives">
  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>Primitives</h1>
  25. </div>
  26. <div class="lesson">
  27. <div class="lesson-main">
  28. <p>Cet article fait partie d'une série consacrée à Three.js.
  29. Le premier article s'intitule <a href="fundamentals.html">Principes de base</a>.
  30. Si vous ne l'avez pas encore lu, vous voudriez peut-être commencer par là.</p>
  31. <p>Three.js a un grand nombre de primitives. Les primitives
  32. sont généralement des formes 3D qui sont générées à l'exécution
  33. avec un tas de paramètres.</p>
  34. <p>Il est courant d'utiliser des primitives des objets comme des sphères
  35. pour un globe ou un tas de boîtes pour dessiner un graphique en 3D.
  36. Il est particulièrement courant d'utiliser des primitives pour faire
  37. des expériences et se lancer dans la 3D. Pour la majorité des
  38. applications 3D, il est courant de demander à un artiste de faire des modèles 3D
  39. dans un programme de modélisation 3D comme <a href="https://blender.org">Blender</a>,
  40. <a href="https://www.autodesk.com/products/maya/">Maya</a> ou <a href="https://www.maxon.net/en-us/products/cinema-4d/">Cinema 4D</a>.
  41. Plus tard dans cette série,
  42. nous aborderons la conception et le chargement de données provenant de
  43. plusieurs programme de modélisation 3D. Pour l'instant, passons
  44. en revue certaines primitives disponibles.</p>
  45. <p>La plupart des primitives ci-dessous ont des valeurs par défaut
  46. pour certain ou tous leurs paramètres. Vous pouvez donc les
  47. utiliser en fonction de vos besoins.</p>
  48. <div id="Diagram-BoxGeometry" data-primitive="BoxGeometry">Une Boîte</div>
  49. <div id="Diagram-CircleGeometry" data-primitive="CircleGeometry">Un Cercle plat</div>
  50. <div id="Diagram-ConeGeometry" data-primitive="ConeGeometry">Un Cône</div>
  51. <div id="Diagram-CylinderGeometry" data-primitive="CylinderGeometry">Un Cylindre</div>
  52. <div id="Diagram-DodecahedronGeometry" data-primitive="DodecahedronGeometry">Un Dodécaèdre (12 côtés)</div>
  53. <div id="Diagram-ExtrudeGeometry" data-primitive="ExtrudeGeometry">Une forme 2D extrudée avec un biseautage optionnel. Ici, nous extrudons une forme de cœur. Notez qu'il s'agit du principe de fonctionnement pour les <a href="/docs/#api/en/geometries/TextGeometry"><code class="notranslate" translate="no">TextGeometry</code></a> et les <a href="/docs/#api/en/geometries/TextGeometry"><code class="notranslate" translate="no">TextGeometry</code></a>.</div>
  54. <div id="Diagram-IcosahedronGeometry" data-primitive="IcosahedronGeometry">Un Icosaèdre (20 côtés)</div>
  55. <div id="Diagram-LatheGeometry" data-primitive="LatheGeometry">Une forme généré par la rotation d'une ligne pour, par exemple, dessiner une lampe, une quille, une bougie, un bougeoir, un verre à vin, etc. Vous fournissez une silhouette en deux dimensions comme une série de points et vous indiquez ensuite à Three.js combien de subdivisions sont nécessaires en faisant tourner la silhouette autour d'un axe.</div>
  56. <div id="Diagram-OctahedronGeometry" data-primitive="OctahedronGeometry">Un Octaèdre (8 côtés)</div>
  57. <div id="Diagram-ParametricGeometry" data-primitive="ParametricGeometry">Une surface générée en fournissant à la fonction un point 2D d'une grille et retourne le point 3D correspondant.</div>
  58. <div id="Diagram-PlaneGeometry" data-primitive="PlaneGeometry">Un plan 2D</div>
  59. <div id="Diagram-PolyhedronGeometry" data-primitive="PolyhedronGeometry">Prend un ensemble de triangles centrés autour d'un point et les projettes sur une sphère</div>
  60. <div id="Diagram-RingGeometry" data-primitive="RingGeometry">Un disque 2D avec un trou au centre</div>
  61. <div id="Diagram-ShapeGeometry" data-primitive="ShapeGeometry">Un tracé 2D qui se triangule</div>
  62. <div id="Diagram-SphereGeometry" data-primitive="SphereGeometry">une sphère</div>
  63. <div id="Diagram-TetrahedronGeometry" data-primitive="TetrahedronGeometry">Un tétraèdre (4 côtés)</div>
  64. <div id="Diagram-TextGeometry" data-primitive="TextGeometry">Texte 3D généré à partir d'une police 3D et d'une chaîne de caractères</div>
  65. <div id="Diagram-TorusGeometry" data-primitive="TorusGeometry">Un tore (donut)</div>
  66. <div id="Diagram-TorusKnotGeometry" data-primitive="TorusKnotGeometry">Un nœud torique</div>
  67. <div id="Diagram-TubeGeometry" data-primitive="TubeGeometry">Extrusion contrôlée d'un cercle le long d'un tracé</div>
  68. <div id="Diagram-EdgesGeometry" data-primitive="EdgesGeometry">Un objet d'aide qui prend une autre
  69. géométrie en entrée et génère des arêtes que si l'angle entre les faces est supérieur à un certain
  70. seuil. Par exemple, si vous regardez en haut de la boîte, elle montre une ligne passant par chaque
  71. face et montrant chaque triangle qui forme la boîte. Si vous utilisez une
  72. <a href="/docs/#api/en/geometries/EdgesGeometry"><code class="notranslate" translate="no">EdgesGeometry</code></a> les lignes du milieu sont supprimées. Ajustez le "thresholdAngle"
  73. ci-dessous et vous verrez les arêtes en dessous de ce seuil disparatre.</div>
  74. <div id="Diagram-WireframeGeometry" data-primitive="WireframeGeometry">Génère une géométrie qui
  75. contient un segment de droite (2 points) par arête dans la géométrie donnée. Sans cela, il vous
  76. manquerait souvent des arêtes ou vous obtiendriez des arêtes supplémentaires puisque WebGL exige
  77. généralement 2 points par segment de ligne. Par exemple, si vous n'aviez qu'un seul triangle, il
  78. n'y aurait que 3 points. Si vous essayez de le dessiner en utilisant un matériau avec
  79. <code class="notranslate" translate="no">wireframe: true</code> vous n'obtiendrez qu'une seule ligne. Si vous passez cette géométrie
  80. triangulaire à un <a href="/docs/#api/en/geometries/WireframeGeometry"><code class="notranslate" translate="no">WireframeGeometry</code></a> vous obtenez une nouvelle géométrie qui comporte
  81. 3 segments de lignes utilisant 6 points.</div>
  82. <p>Nous reviendrons sur la création de géométrie personnalisée dans
  83. <a href="custom-buffergeometry.html">un autre article</a>. Pour l'instant,
  84. faisons un exemple en créant chaque type de primitive. Nous
  85. commencerons par les <a href="responsive.html">exemples vus dans l'article précédent</a>.</p>
  86. <p>Mais tout d'abord, définissons un couleur de fond :</p>
  87. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  88. +scene.background = new THREE.Color(0xAAAAAA);
  89. </pre>
  90. <p>Cela indique à three.js d'utiliser un fond gris clair.</p>
  91. <p>La caméra doit changer de position pour que nous puissions voir tous les objets.</p>
  92. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">-const fov = 75;
  93. +const fov = 40; // champ de vue (field of view)
  94. const aspect = 2;
  95. const near = 0.1; // distance minimum
  96. -const far = 5;
  97. +const far = 1000; // distance maximum
  98. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  99. -camera.position.z = 2;
  100. +camera.position.z = 120;
  101. </pre>
  102. <p>Ajoutons une fonction, <code class="notranslate" translate="no">addObject</code>, qui prend une position x, y et un <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a>
  103. et ajoute l'objet à la scène.</p>
  104. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const objects = [];
  105. const spread = 15;
  106. function addObject (x, y, obj) {
  107. obj.position.x = x * spread;
  108. obj.position.y = y * spread;
  109. scene.add(obj);
  110. objects.push(obj);
  111. }
  112. </pre>
  113. <p>Faisons aussi une fonction pour créer un matériau coloré aléatoire.
  114. Nous utiliserons une fonction de <a href="/docs/#api/en/math/Color"><code class="notranslate" translate="no">Color</code></a> qui vous permet de définir
  115. une couleur en fonction de la teinte, de la saturation et de la luminosité.</p>
  116. <p>La <code class="notranslate" translate="no">hue</code> (teinte) va de 0 à 1 autour de la roue des couleurs avec
  117. le rouge à 0, le vert à 0,33 et le bleu à 0,66. La <code class="notranslate" translate="no">saturation</code>
  118. va de 0 à 1, 0 n'ayant pas de couleur et 1 étant saturé. La <code class="notranslate" translate="no">luminance</code>
  119. (luminosité) va de 0 à 1, 0 étant le noir, 1 le blanc et 0,5 la
  120. quantité maximale de la couleur. En d'autres termes, lorsque la
  121. <code class="notranslate" translate="no">luminance</code> va de 0,0 à 0,5, la couleur passe du noir à <code class="notranslate" translate="no">hue</code> (la teinte).
  122. De 0,5 à 1,0 la couleur passe de <code class="notranslate" translate="no">hue</code> au blanc.</p>
  123. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function createMaterial () {
  124. const material = new THREE.MeshPhongMaterial({
  125. side: THREE.DoubleSide,
  126. });
  127. const hue = Math.random(); // teinte
  128. const saturation = 1;
  129. const luminance = .5; // luminosité
  130. material.color.setHSL(hue, saturation, luminance);
  131. return material;
  132. }
  133. </pre>
  134. <p>Nous avons également passé <code class="notranslate" translate="no">side: THREE.DoubleSide</code> au matériau.
  135. Cela indique à three de dessiner les deux côtés des triangles
  136. qui constituent une forme. Pour un solide comme une sphère
  137. ou un cube, il n'y a généralement pas de raison de dessiner les
  138. côtés arrières des triangles car ils sont tous tournés ver l'intérieur
  139. de la forme. Dans notre cas, cependant, nous dessinons des objets
  140. comme la <a href="/docs/#api/en/geometries/PlaneGeometry"><code class="notranslate" translate="no">PlaneGeometry</code></a> ou la <a href="/docs/#api/en/geometries/ShapeGeometry"><code class="notranslate" translate="no">ShapeGeometry</code></a>
  141. qui sont bidimensionnnels et n'ont donc pas d'intérieur.
  142. Sans le paramètre <code class="notranslate" translate="no">side: THREE.DoubleSide</code> ils disparaîtraient
  143. quand on regarderait leur dos.</p>
  144. <p>Notons qu'il est plus rapide de dessiner quand on ne met <strong>pas</strong>
  145. <code class="notranslate" translate="no">side: THREE.DoubleSide</code>, donc l'idéal serait de ne le mettre que sur
  146. les matériaux qui en ont vraiment besoin, mais pour cet exemple, nous
  147. dessinons peu d'objets, donc il n'y a pas de raisons de s'en inquiéter.</p>
  148. <p>Faisons une fonction, <code class="notranslate" translate="no">addSolidGeometry</code>, qui
  149. reçoit une géométrie et crée un matériau coloré
  150. aléatoire via <code class="notranslate" translate="no">createMaterial</code> et l'ajoute à la
  151. scène via <code class="notranslate" translate="no">addObject</code>.</p>
  152. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function addSolidGeometry(x, y, geometry) {
  153. const mesh = new THREE.Mesh(geometry, createMaterial());
  154. addObject(x, y, mesh);
  155. }
  156. </pre>
  157. <p>Nous pouvons maintenant l'utiliser pour la majorité des primitives que nous créons.
  158. Par exemple, la création d'une boîte :</p>
  159. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  160. const width = 8; // largeur
  161. const height = 8; // hauteur
  162. const depth = 8; // profondeur
  163. addSolidGeometry(-2, -2, new THREE.BoxGeometry(width, height, depth));
  164. }
  165. </pre>
  166. <p>Si vous regardez dans le code ci-dessous, vous verrez une section similaire pour chaque type de géométrie.</p>
  167. <p>Voici le résultat :</p>
  168. <p></p><div translate="no" class="threejs_example_container notranslate">
  169. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/primitives.html"></iframe></div>
  170. <a class="threejs_center" href="/manual/examples/primitives.html" target="_blank">Cliquer ici pour ouvrir dans une fenêtre séparée</a>
  171. </div>
  172. <p></p>
  173. <p>Il y a quelques exceptions notables au modèle ci-dessus.
  174. La plus grande est probablement le <a href="/docs/#api/en/geometries/TextGeometry"><code class="notranslate" translate="no">TextGeometry</code></a>. Il doit charger
  175. des données de police en 3D avant de pouvoir générer un maillage pour le texte.
  176. Ces données se chargent de manière asynchrone, nous devons donc attendre
  177. qu'elles soient chargées avant d'essayer de créer la géométrie. En "promettant"
  178. le chargement des polices, nous pouvons faciliter la tâche.
  179. Une créons un <a href="/docs/#api/en/loaders/FontLoader"><code class="notranslate" translate="no">FontLoader</code></a> et une fonction <code class="notranslate" translate="no">loadFont</code> qui retourne
  180. une promesse, qui une fois résolue, nous donnera la police. Nous créons
  181. une fonction <code class="notranslate" translate="no">async</code> appelée <code class="notranslate" translate="no">doit</code> (fais le) et chargeons la police en utilisant <code class="notranslate" translate="no">await</code> (attends).
  182. Et enfin, nous créons la géométrie et appelons <code class="notranslate" translate="no">addObject</code> pour l'ajouter à la scène.</p>
  183. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  184. const loader = new FontLoader();
  185. // promisify font loading
  186. function loadFont(url) {
  187. return new Promise((resolve, reject) =&gt; {
  188. loader.load(url, resolve, undefined, reject);
  189. });
  190. }
  191. async function doit() {
  192. const font = await loadFont('../resources/threejs/fonts/helvetiker_regular.typeface.json'); /* threejs.org: url */
  193. const geometry = new TextGeometry('three.js', {
  194. font: font,
  195. size: 3.0,
  196. depth: .2,
  197. curveSegments: 12,
  198. bevelEnabled: true,
  199. bevelThickness: 0.15,
  200. bevelSize: .3,
  201. bevelSegments: 5,
  202. });
  203. const mesh = new THREE.Mesh(geometry, createMaterial());
  204. geometry.computeBoundingBox();
  205. geometry.boundingBox.getCenter(mesh.position).multiplyScalar(-1);
  206. const parent = new THREE.Object3D();
  207. parent.add(mesh);
  208. addObject(-1, -1, parent);
  209. }
  210. doit();
  211. }
  212. </pre>
  213. <p>Il y a une autre différence. Nous voulons faire tourner le texte autour de son
  214. centre, mais par défaut three.js crée le texte de tel sorte que son centre de rotation
  215. se trouve sur le bord gauche. Pour contourner ce problème, nous pouvons demander à
  216. three.js de calculer une boite englobant la géométrie.
  217. Nous pouvons alors appeler la méthode <code class="notranslate" translate="no">getCenter</code> de cette boite
  218. et lui passer la position du maillage de notre objet. La méthode
  219. <code class="notranslate" translate="no">getCenter</code> copie le centre de la boite dans la position.
  220. Elle renvoie également l'objet position afin que nous puissions appeler
  221. <code class="notranslate" translate="no">multiplyScalar(-1)</code> pour positionner l'objet entier de tel sorte que son
  222. centre de rotation soit positioné au centre de l'objet.</p>
  223. <p>Si nous appelons juste <code class="notranslate" translate="no">addSolidGeometry</code> comme dans les
  224. exemples précédents, il s'établirait une position
  225. qui ne serait pas correcte. Donc, dans ce cas, nous créons un <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a>
  226. qui est un nœud standard pour les scènes three.js. <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>
  227. hérite également de <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a> (confère l'article
  228. <a href="scenegraph.html">comment un graphe de scène fonctionne</a>).
  229. Pour l'instant, il suffit de savoir que,
  230. comme les nœuds DOM, les enfants sont placés de façon relative par rapport à leur parent.
  231. En créant un <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a> et en faisant de notre maillage (mesh) un
  232. enfant de celui-ci nous pouvons positionner l'<a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a> où nous
  233. voulons tout en conservant le décalage central que nous avons
  234. fixé précédemment.</p>
  235. <p>Si nous ne faisions pas cela, le texte serait alors décentré !</p>
  236. <p></p><div translate="no" class="threejs_example_container notranslate">
  237. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/primitives-text.html"></iframe></div>
  238. <a class="threejs_center" href="/manual/examples/primitives-text.html" target="_blank">Cliquer ici pour ouvrir dans une fenêtre séparée</a>
  239. </div>
  240. <p></p>
  241. <p>Notons que celui de gauche ne tourne pas autour de son centre
  242. alors que celui de droite le fait.</p>
  243. <p>Les autres exceptions sont les exemples de 2 lignes pour la <a href="/docs/#api/en/geometries/EdgesGeometry"><code class="notranslate" translate="no">EdgesGeometry</code></a>
  244. et la <a href="/docs/#api/en/geometries/WireframeGeometry"><code class="notranslate" translate="no">WireframeGeometry</code></a>. Au lieu d'appeler <code class="notranslate" translate="no">addSolidGeometry</code> ils appellent
  245. <code class="notranslate" translate="no">addLineGeometry</code> dont le code ressemble à :</p>
  246. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function addLineGeometry(x, y, geometry) {
  247. const material = new THREE.LineBasicMaterial({color: 0x000000});
  248. const mesh = new THREE.LineSegments(geometry, material);
  249. addObject(x, y, mesh);
  250. }
  251. </pre>
  252. <p>Cette fonction crée un <a href="/docs/#api/en/materials/LineBasicMaterial"><code class="notranslate" translate="no">LineBasicMaterial</code></a> noir et crée ensuite un objet <a href="/docs/#api/en/objects/LineSegments"><code class="notranslate" translate="no">LineSegments</code></a>
  253. qui est enveloppé par le <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> qui permet à three de savoir que vous
  254. affichez des segments de droite (2 points par segment).</p>
  255. <p>Chacune des primitives a plusieurs paramètres que vous pouvez passer à la création
  256. et il est préférable que vous <a href="https://threejs.org/docs/">regardez la documentation</a>
  257. de tous ces paramètres par vous même plutôt que de la répéter dans ce document.
  258. Vous pouvez également cliquer sur les liens ci-dessus à côté de chaque
  259. forme pour accéder directement à la documentation correspondante.</p>
  260. <p>Il y a une paire de classe qui ne correspond pas vraiment aux modèles ci-dessus. Il s'agit des
  261. classes <a href="/docs/#api/en/materials/PointsMaterial"><code class="notranslate" translate="no">PointsMaterial</code></a> et <a href="/docs/#api/en/objects/Points"><code class="notranslate" translate="no">Points</code></a>. Les <a href="/docs/#api/en/objects/Points"><code class="notranslate" translate="no">Points</code></a> sont comme les <a href="/docs/#api/en/objects/LineSegments"><code class="notranslate" translate="no">LineSegments</code></a> ci-dessus en
  262. ce sens qu'ils prennent une <code class="notranslate" translate="no">Geometry</code> ou une <a href="/docs/#api/en/core/BufferGeometry"><code class="notranslate" translate="no">BufferGeometry</code></a> mais dessinent des points à chaque
  263. sommet au lieu de lignes.
  264. Pour l'utiliser, vous devez également lui passer un <a href="/docs/#api/en/materials/PointsMaterial"><code class="notranslate" translate="no">PointsMaterial</code></a> qui
  265. prend une taille (<a href="/docs/#api/en/materials/PointsMaterial#size"><code class="notranslate" translate="no">size</code></a>) pour la grosseur des points.</p>
  266. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const radius = 7; // rayon
  267. const widthSegments = 12;
  268. const heightSegments = 8;
  269. const geometry = new THREE.SphereGeometry(radius, widthSegments, heightSegments);
  270. const material = new THREE.PointsMaterial({
  271. color: 'red',
  272. size: 0.2, // en unités du monde
  273. });
  274. const points = new THREE.Points(geometry, material);
  275. scene.add(points);
  276. </pre>
  277. <div class="spread">
  278. <div data-diagram="Points"></div>
  279. </div>
  280. <p>Vous pouvez désactiver l'option <a href="/docs/#api/en/materials/PointsMaterial#sizeAttenuation"><code class="notranslate" translate="no">sizeAttenuation</code></a> en la réglant
  281. sur "false" si vous souhaitez que les points soient de la même taille quelle que soit leur
  282. distance par rapport à la caméra.</p>
  283. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const material = new THREE.PointsMaterial({
  284. color: 'red',
  285. + sizeAttenuation: false,
  286. + size: 3, // en pixels
  287. - size: 0.2, // en unités du monde
  288. });
  289. ...
  290. </pre>
  291. <div class="spread">
  292. <div data-diagram="PointsUniformSize"></div>
  293. </div>
  294. <p>Une autre chose qu'il est important de souligner : c'est que presque toutes les formes ont des
  295. réglages différents concernant leur subdivisions. Un bon exemple pourrait être les
  296. géométries des sphères prennant en paramètres le nombre de divisions à faire autour et de
  297. haut en bas. Par exemple :</p>
  298. <div class="spread">
  299. <div data-diagram="SphereGeometryLow"></div>
  300. <div data-diagram="SphereGeometryMedium"></div>
  301. <div data-diagram="SphereGeometryHigh"></div>
  302. </div>
  303. <p>La première sphère a un tour de 5 segments et 3 de haut, soit 15 segments ou 30 triangles.
  304. La deuxième sphère a 24 segments sur 10. cela fait 240 segments ou 480 triangles. Le dernier a
  305. 50 par 50, soir 2500 segments ou 5000 triangles.</p>
  306. <p>C'est à vous de décider du nombre de subdivisions dont vous avez besoin. Il peut sembler que vous
  307. ayez besoin d'un grand nombre de segments, mais si vous enlevez les lignes et les ombres plates,
  308. nous obtenons ceci :</p>
  309. <div class="spread">
  310. <div data-diagram="SphereGeometryLowSmooth"></div>
  311. <div data-diagram="SphereGeometryMediumSmooth"></div>
  312. <div data-diagram="SphereGeometryHighSmooth"></div>
  313. </div>
  314. <p>Il est moins perceptible que celle de droite avec 5000 triangles est meilleure que celle avec
  315. seulement 480 triangles. Si vous ne dessinez que quelques sphères, comme par exemple, un seul
  316. globe pour une carte de la terre, alors une sphère de 10 000 triangles n'est pas un mauvais choix.
  317. Si, par contre, vous essayez de dessiner 1000 sphères alors 1000 sphères multipliées par 10000
  318. triangles représentent chacune 10 millions de triangles. Pour que l'animation soit fluide,
  319. il faut que le navigateur dessine à 60 images par seconde pour que vous demandiez au navigateur
  320. de dessiner 600 millions de triangles par seconde. Cela fait beaucoup trop de calcul.</p>
  321. <p>Parfois, il est facile de choisir. Par exemple, vous pouvez aussi choisir
  322. de subdiviser un plan.</p>
  323. <div class="spread">
  324. <div data-diagram="PlaneGeometryLow"></div>
  325. <div data-diagram="PlaneGeometryHigh"></div>
  326. </div>
  327. <p>Le plan à gauche est composé de 2 triangles. Le plan de droite est composé de 200 triangles.
  328. Contrairement à la sphère, il n'y a pas vraiment de compromis sur la qualité pour la plupart des
  329. cas d'utilisation d'un plan. Vous ne subdiviserez probablement un plan que si vous vous attendez
  330. à vouloir le modifier ou le déformer d'une manière ou d'une autre. Idem pour une boîte.</p>
  331. <p>Choisissez donc ce qui convient le mieux à votre situation. Moins vous choisirez de subdivisions,
  332. plus les choses auront des chances de se dérouler sans heurts et moins il vous faudra de mémoire.
  333. Vous devrez décider vous-même du compromis qui convient le mieux à cas d'utilisation.</p>
  334. <p>Si aucune des formes ci-dessus ne correspond à votre cas d'utilisation, vous pouvez
  335. charger la géométrie par exemple à partir d'un <a href="load-obj.html">fichier .obj</a>
  336. ou d'un <a href="load-gltf.html">fichier .gltf</a>.
  337. Vous pouvez également créer votre <a href="custom-buffergeometry.html">BufferGeometry</a>.</p>
  338. <p>Voyons maintenant l'article traitant sur <a href="scenegraph.html">comment fonctionne un graphe de scène three.js et comment l'utiliser</a>.</p>
  339. <p><link rel="stylesheet" href="../resources/threejs-primitives.css"></p>
  340. <script type="module" src="../resources/threejs-primitives.js"></script>
  341. </div>
  342. </div>
  343. </div>
  344. <script defer src="../resources/prettify.js"></script>
  345. <script defer src="../resources/lesson.js"></script>
  346. </body></html>