primitives.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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 d'articles sur three.js.
  29. Le premier article traitait des <a href="fundamentals.html">notions fondamentales</a>.
  30. Si vous ne l'avez pas encore lu, vous pourriez vouloir commencer par là.</p>
  31. <p>Three.js dispose d'un grand nombre de primitives. Les primitives
  32. sont généralement des formes 3D qui sont générées au moment de l'exécution
  33. avec un ensemble de paramètres.</p>
  34. <p>Il est courant d'utiliser des primitives pour des choses comme une sphère
  35. pour un globe ou un ensemble de boîtes pour dessiner un graphique 3D. Il est
  36. particulièrement courant d'utiliser des primitives pour expérimenter
  37. et commencer avec la 3D. Pour la majorité des applications 3D,
  38. il est plus courant qu'un artiste crée des modèles 3D
  39. dans un programme de modélisation 3D comme <a href="https://blender.org">Blender</a>
  40. ou <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>. Plus tard dans cette série, nous aborderons
  41. la création et le chargement de données à partir de plusieurs programmes de modélisation
  42. 3D. Pour l'instant, passons en revue quelques-unes des primitives disponibles.</p>
  43. <p>Beaucoup des primitives ci-dessous ont des valeurs par défaut pour tout ou partie de leurs
  44. paramètres, de sorte que vous pouvez les utiliser plus ou moins selon vos besoins.</p>
  45. <div id="Diagram-BoxGeometry" data-primitive="BoxGeometry">Une Boîte</div>
  46. <div id="Diagram-CircleGeometry" data-primitive="CircleGeometry">Un cercle plat</div>
  47. <div id="Diagram-ConeGeometry" data-primitive="ConeGeometry">Un Cône</div>
  48. <div id="Diagram-CylinderGeometry" data-primitive="CylinderGeometry">Un Cylindre</div>
  49. <div id="Diagram-DodecahedronGeometry" data-primitive="DodecahedronGeometry">Un dodécaèdre (12 faces)</div>
  50. <div id="Diagram-ExtrudeGeometry" data-primitive="ExtrudeGeometry">Une forme 2D extrudée avec biseautage optionnel.
  51. Ici, nous extrudons une forme de cœur. Notez que c'est la base
  52. de <a href="/docs/#examples/en/geometries/TextGeometry"><code class="notranslate" translate="no">TextGeometry</code></a>.</div>
  53. <div id="Diagram-IcosahedronGeometry" data-primitive="IcosahedronGeometry">Un icosaèdre (20 faces)</div>
  54. <div id="Diagram-LatheGeometry" data-primitive="LatheGeometry">Une forme générée en faisant tourner une ligne. Exemples : lampes, quilles de bowling, bougies, chandeliers, verres à vin, verres à boire, etc... Vous fournissez la silhouette 2D comme une série de points, puis vous indiquez à three.js combien de subdivisions créer en faisant tourner la silhouette autour d'un axe.</div>
  55. <div id="Diagram-OctahedronGeometry" data-primitive="OctahedronGeometry">Un Octaèdre (8 faces)</div>
  56. <div id="Diagram-ParametricGeometry" data-primitive="ParametricGeometry">Une surface générée en fournissant une fonction qui prend un point 2D d'une grille et renvoie le point 3D correspondant.</div>
  57. <div id="Diagram-PlaneGeometry" data-primitive="PlaneGeometry">Un plan 2D</div>
  58. <div id="Diagram-PolyhedronGeometry" data-primitive="PolyhedronGeometry">Prend un ensemble de triangles centrés autour d'un point et les projette sur une sphère</div>
  59. <div id="Diagram-RingGeometry" data-primitive="RingGeometry">Un disque 2D avec un trou au centre</div>
  60. <div id="Diagram-ShapeGeometry" data-primitive="ShapeGeometry">Un contour 2D qui est triangulé</div>
  61. <div id="Diagram-SphereGeometry" data-primitive="SphereGeometry">Une sphère</div>
  62. <div id="Diagram-TetrahedronGeometry" data-primitive="TetrahedronGeometry">Un tétraèdre (4 faces)</div>
  63. <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>
  64. <div id="Diagram-TorusGeometry" data-primitive="TorusGeometry">Un tore (beignet)</div>
  65. <div id="Diagram-TorusKnotGeometry" data-primitive="TorusKnotGeometry">Un nœud torique</div>
  66. <div id="Diagram-TubeGeometry" data-primitive="TubeGeometry">Un cercle tracé le long d'un chemin</div>
  67. <div id="Diagram-EdgesGeometry" data-primitive="EdgesGeometry">Un objet d'aide qui prend une autre géométrie en entrée et génère des arêtes seulement si l'angle entre les faces est supérieur à un certain seuil. Par exemple, si vous regardez la boîte en haut, elle montre une ligne traversant chaque face, montrant chaque triangle qui compose la boîte. En utilisant un <a href="/docs/#api/en/geometries/EdgesGeometry"><code class="notranslate" translate="no">EdgesGeometry</code></a> à la place, les lignes du milieu sont supprimées. Ajustez le seuil `thresholdAngle` ci-dessous et vous verrez les arêtes en dessous de ce seuil disparaître.</div>
  68. <div id="Diagram-WireframeGeometry" data-primitive="WireframeGeometry">Génère une géométrie qui contient un segment de ligne (2 points) par arête dans la géométrie donnée. Sans cela, il vous manquerait souvent des arêtes ou vous obtiendriez des arêtes supplémentaires car WebGL nécessite généralement 2 points par segment de ligne. Par exemple, si vous n'aviez qu'un seul triangle, il n'y aurait que 3 points. Si vous essayiez de le dessiner en utilisant un matériau avec <code class="notranslate" translate="no">wireframe: true</code>, vous n'obtiendriez qu'une seule ligne. Passer cette géométrie de triangle à un <a href="/docs/#api/en/geometries/WireframeGeometry"><code class="notranslate" translate="no">WireframeGeometry</code></a> générera une nouvelle géométrie qui a 3 segments de ligne utilisant 6 points.</div>
  69. <p>Nous aborderons la création de géométries personnalisées dans <a href="custom-buffergeometry.html">un autre article</a>. Pour l'instant,
  70. faisons un exemple créant chaque type de primitive. Nous commencerons
  71. avec les <a href="responsive.html">exemples de l'article précédent</a>.</p>
  72. <p>Près du haut, définissons une couleur de fond</p>
  73. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  74. +scene.background = new THREE.Color(0xAAAAAA);
  75. </pre>
  76. <p>Cela indique à three.js d'effacer avec un gris clair.</p>
  77. <p>La caméra doit changer de position afin que nous puissions voir tous les
  78. objets.</p>
  79. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">-const fov = 75;
  80. +const fov = 40;
  81. const aspect = 2; // the canvas default
  82. const near = 0.1;
  83. -const far = 5;
  84. +const far = 1000;
  85. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  86. -camera.position.z = 2;
  87. +camera.position.z = 120;
  88. </pre>
  89. <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> et ajoute
  90. l'objet à la scène.</p>
  91. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const objects = [];
  92. const spread = 15;
  93. function addObject(x, y, obj) {
  94. obj.position.x = x * spread;
  95. obj.position.y = y * spread;
  96. scene.add(obj);
  97. objects.push(obj);
  98. }
  99. </pre>
  100. <p>Créons également une fonction pour créer un matériau de couleur aléatoire.
  101. Nous utiliserons une fonctionnalité de <a href="/docs/#api/en/math/Color"><code class="notranslate" translate="no">Color</code></a>
  102. qui vous permet de définir une couleur
  103. basée sur la teinte, la saturation et la luminance.</p>
  104. <p><code class="notranslate" translate="no">hue</code> (teinte) va de 0 à 1 autour de la roue chromatique avec
  105. le rouge à 0, le vert à 0.33 et le bleu à 0.66. <code class="notranslate" translate="no">saturation</code>
  106. va de 0 à 1, 0 n'ayant pas de couleur et 1 étant
  107. la plus saturée. <code class="notranslate" translate="no">luminance</code> va de 0 à 1
  108. avec 0 étant le noir, 1 étant le blanc et 0.5 étant
  109. la quantité maximale de couleur. En d'autres termes,
  110. lorsque la <code class="notranslate" translate="no">luminance</code> passe de 0.0 à 0.5, la couleur
  111. passe du noir à la <code class="notranslate" translate="no">hue</code> (teinte). De 0.5 à 1.0,
  112. la couleur passe de la <code class="notranslate" translate="no">hue</code> (teinte) au blanc.</p>
  113. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function createMaterial() {
  114. const material = new THREE.MeshPhongMaterial({
  115. side: THREE.DoubleSide,
  116. });
  117. const hue = Math.random();
  118. const saturation = 1;
  119. const luminance = .5;
  120. material.color.setHSL(hue, saturation, luminance);
  121. return material;
  122. }
  123. </pre>
  124. <p>Nous avons également passé <code class="notranslate" translate="no">side: THREE.DoubleSide</code> au matériau.
  125. Cela indique à three de dessiner les deux côtés des triangles
  126. qui composent une forme. Pour une forme solide comme une sphère
  127. ou un cube, il n'y a généralement aucune raison de dessiner les
  128. côtés arrière des triangles car ils font tous face à l'intérieur de la
  129. forme. Dans notre cas cependant, nous dessinons quelques éléments
  130. comme le <a href="/docs/#api/en/geometries/PlaneGeometry"><code class="notranslate" translate="no">PlaneGeometry</code></a> et le <a href="/docs/#api/en/geometries/ShapeGeometry"><code class="notranslate" translate="no">ShapeGeometry</code></a>
  131. qui sont bidimensionnels et n'ont donc pas d'intérieur. Sans
  132. définir <code class="notranslate" translate="no">side: THREE.DoubleSide</code>, ils disparaîtraient
  133. en regardant leurs côtés arrière.</p>
  134. <p>Je dois noter qu'il est plus rapide de dessiner lorsque l'on ne définit <strong>pas</strong>
  135. <code class="notranslate" translate="no">side: THREE.DoubleSide</code>, donc idéalement nous ne le définirions que sur
  136. les matériaux qui en ont vraiment besoin, mais dans ce cas, nous
  137. ne dessinons pas trop, donc il n'y a pas beaucoup de raison de
  138. s'en soucier.</p>
  139. <p>Créons une fonction, <code class="notranslate" translate="no">addSolidGeometry</code>, à laquelle
  140. nous passons une géométrie, et elle crée un matériau de couleur aléatoire
  141. via <code class="notranslate" translate="no">createMaterial</code> et l'ajoute à la scène
  142. via <code class="notranslate" translate="no">addObject</code>.</p>
  143. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function addSolidGeometry(x, y, geometry) {
  144. const mesh = new THREE.Mesh(geometry, createMaterial());
  145. addObject(x, y, mesh);
  146. }
  147. </pre>
  148. <p>Maintenant, nous pouvons l'utiliser pour la majorité des primitives que nous créons.
  149. Par exemple, pour créer une boîte</p>
  150. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  151. const width = 8;
  152. const height = 8;
  153. const depth = 8;
  154. addSolidGeometry(-2, -2, new THREE.BoxGeometry(width, height, depth));
  155. }
  156. </pre>
  157. <p>Si vous regardez le code ci-dessous, vous verrez une section similaire pour chaque type de géométrie.</p>
  158. <p>Voici le résultat :</p>
  159. <p></p><div translate="no" class="threejs_example_container notranslate">
  160. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/primitives.html"></iframe></div>
  161. <a class="threejs_center" href="/manual/examples/primitives.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  162. </div>
  163. <p></p>
  164. <p>Il y a quelques exceptions notables au modèle ci-dessus.
  165. La plus importante est probablement la <a href="/docs/#examples/en/geometries/TextGeometry"><code class="notranslate" translate="no">TextGeometry</code></a>. Elle nécessite de charger
  166. les données de police 3D avant de pouvoir générer un maillage pour le texte.
  167. Ces données se chargent de manière asynchrone, nous devons donc attendre qu'elles
  168. soient chargées avant d'essayer de créer la géométrie. En "promisifiant"
  169. le chargement de la police, nous pouvons rendre les choses beaucoup plus faciles.
  170. Nous créons un <a href="/docs/#api/en/loaders/FontLoader"><code class="notranslate" translate="no">FontLoader</code></a>, puis une fonction <code class="notranslate" translate="no">loadFont</code> qui renvoie
  171. une promesse qui, une fois résolue, nous donnera la police. Nous créons ensuite
  172. une fonction <code class="notranslate" translate="no">async</code> appelée <code class="notranslate" translate="no">doit</code> et chargeons la police en utilisant <code class="notranslate" translate="no">await</code>.
  173. 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>
  174. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  175. const loader = new FontLoader();
  176. // promisify font loading
  177. function loadFont(url) {
  178. return new Promise((resolve, reject) =&gt; {
  179. loader.load(url, resolve, undefined, reject);
  180. });
  181. }
  182. async function doit() {
  183. const font = await loadFont('resources/threejs/fonts/helvetiker_regular.typeface.json'); /* threejs.org : URL */
  184. const geometry = new TextGeometry('three.js', {
  185. font: font,
  186. size: 3.0,
  187. depth: .2,
  188. curveSegments: 12,
  189. bevelEnabled: true,
  190. bevelThickness: 0.15,
  191. bevelSize: .3,
  192. bevelSegments: 5,
  193. });
  194. const mesh = new THREE.Mesh(geometry, createMaterial());
  195. geometry.computeBoundingBox();
  196. geometry.boundingBox.getCenter(mesh.position).multiplyScalar(-1);
  197. const parent = new THREE.Object3D();
  198. parent.add(mesh);
  199. addObject(-1, -1, parent);
  200. }
  201. doit();
  202. }
  203. </pre>
  204. <p>Il y a une autre différence. Nous voulons faire tourner le texte autour de son
  205. centre, mais par défaut, three.js crée le texte de manière à ce que son centre de rotation
  206. soit sur le bord gauche. Pour contourner ce problème, nous pouvons demander à three.js de calculer la
  207. boîte englobante (bounding box) de la géométrie. Nous pouvons ensuite appeler la méthode <code class="notranslate" translate="no">getCenter</code>
  208. de la boîte englobante et lui passer l'objet position de notre maillage.
  209. <code class="notranslate" translate="no">getCenter</code> copie le centre de la boîte dans la position.
  210. Elle renvoie également l'objet position afin que nous puissions appeler <code class="notranslate" translate="no">multiplyScalar(-1)</code>
  211. pour positionner l'objet entier de sorte que son centre de rotation
  212. soit au centre de l'objet.</p>
  213. <p>Si nous appelions simplement <code class="notranslate" translate="no">addSolidGeometry</code> comme avec les exemples précédents,
  214. cela redéfinirait la position, ce qui n'est pas bon.
  215. Donc, dans ce cas, nous créons un <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a> qui
  216. est le nœud standard pour le graphe de scène de three.js. <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a>
  217. est également hérité de <a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a>. Nous aborderons <a href="scenegraph.html">le fonctionnement du graphe de scène
  218. dans un autre article</a>.
  219. Pour l'instant, il suffit de savoir que,
  220. comme les nœuds DOM, les enfants sont dessinés par rapport à leur parent.
  221. 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 un enfant de celui-ci,
  222. nous pouvons positionner l'<a href="/docs/#api/en/core/Object3D"><code class="notranslate" translate="no">Object3D</code></a> où nous voulons tout en
  223. conservant le décalage central que nous avons défini précédemment.</p>
  224. <p>Si nous ne faisions pas cela, le texte tournerait de manière décentrée.</p>
  225. <p></p><div translate="no" class="threejs_example_container notranslate">
  226. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/primitives-text.html"></iframe></div>
  227. <a class="threejs_center" href="/manual/examples/primitives-text.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  228. </div>
  229. <p></p>
  230. <p>Notez que celui de gauche ne tourne pas autour de son centre
  231. tandis que celui de droite le fait.</p>
  232. <p>Les autres exceptions sont les 2 exemples basés sur des lignes pour <a href="/docs/#api/en/geometries/EdgesGeometry"><code class="notranslate" translate="no">EdgesGeometry</code></a>
  233. et <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>, elles appellent
  234. <code class="notranslate" translate="no">addLineGeometry</code> qui ressemble à ceci</p>
  235. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function addLineGeometry(x, y, geometry) {
  236. const material = new THREE.LineBasicMaterial({color: 0x000000});
  237. const mesh = new THREE.LineSegments(geometry, material);
  238. addObject(x, y, mesh);
  239. }
  240. </pre>
  241. <p>Elle 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>
  242. qui est un wrapper pour <a href="/docs/#api/en/objects/Mesh"><code class="notranslate" translate="no">Mesh</code></a> et aide three à savoir que vous rendez
  243. des segments de ligne (2 points par segment).</p>
  244. <p>Chacune des primitives possède plusieurs paramètres que vous pouvez passer lors de sa création
  245. et il est préférable de <a href="https://threejs.org/docs/">consulter la documentation</a> pour les voir tous plutôt que
  246. de les répéter ici. Vous pouvez également cliquer sur les liens ci-dessus à côté de chaque forme
  247. pour accéder directement à la documentation de cette forme.</p>
  248. <p>Il existe une autre paire de classes qui ne correspondent pas vraiment aux modèles ci-dessus. Ce sont
  249. les 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>. <a href="/docs/#api/en/objects/Points"><code class="notranslate" translate="no">Points</code></a> est similaire à <a href="/docs/#api/en/objects/LineSegments"><code class="notranslate" translate="no">LineSegments</code></a> ci-dessus en ce sens qu'elle prend une
  250. <a href="/docs/#api/en/core/BufferGeometry"><code class="notranslate" translate="no">BufferGeometry</code></a> mais dessine des points à chaque sommet au lieu de lignes.
  251. 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
  252. prend un paramètre <a href="/docs/#api/en/materials/PointsMaterial#size"><code class="notranslate" translate="no">size</code></a> pour définir la taille des points.</p>
  253. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const radius = 7;
  254. const widthSegments = 12;
  255. const heightSegments = 8;
  256. const geometry = new THREE.SphereGeometry(radius, widthSegments, heightSegments);
  257. const material = new THREE.PointsMaterial({
  258. color: 'red',
  259. size: 0.2, // in world units
  260. });
  261. const points = new THREE.Points(geometry, material);
  262. scene.add(points);
  263. </pre>
  264. <div class="spread">
  265. <div data-diagram="Points"></div>
  266. </div>
  267. <p>Vous pouvez désactiver <a href="/docs/#api/en/materials/PointsMaterial#sizeAttenuation"><code class="notranslate" translate="no">sizeAttenuation</code></a> en le définissant à false si vous souhaitez que les points
  268. aient la même taille quelle que soit leur distance par rapport à la caméra.</p>
  269. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const material = new THREE.PointsMaterial({
  270. color: 'red',
  271. + sizeAttenuation: false,
  272. + size: 3, // in pixels
  273. - size: 0.2, // in world units
  274. });
  275. ...
  276. </pre>
  277. <div class="spread">
  278. <div data-diagram="PointsUniformSize"></div>
  279. </div>
  280. <p>Une autre chose importante à aborder est que presque toutes les formes
  281. ont divers paramètres pour déterminer combien les subdiviser. Un bon exemple
  282. pourrait être les géométries de sphères. Les sphères prennent des paramètres pour
  283. le nombre de divisions à faire autour et de haut en bas. Par exemple</p>
  284. <div class="spread">
  285. <div data-diagram="SphereGeometryLow"></div>
  286. <div data-diagram="SphereGeometryMedium"></div>
  287. <div data-diagram="SphereGeometryHigh"></div>
  288. </div>
  289. <p>La première sphère a 5 segments autour et 3 en hauteur, soit 15 segments
  290. ou 30 triangles. La deuxième sphère a 24 segments sur 10, soit 240 segments
  291. ou 480 triangles. La dernière a 50 sur 50, soit 2500 segments ou 5000 triangles.</p>
  292. <p>C'est à vous de décider du nombre de subdivisions dont vous avez besoin. Il peut
  293. sembler que vous ayez besoin d'un grand nombre de segments, mais supprimez les lignes
  294. et l'ombrage plat, et nous obtenons ceci</p>
  295. <div class="spread">
  296. <div data-diagram="SphereGeometryLowSmooth"></div>
  297. <div data-diagram="SphereGeometryMediumSmooth"></div>
  298. <div data-diagram="SphereGeometryHighSmooth"></div>
  299. </div>
  300. <p>Il n'est maintenant plus si clair que celle de droite avec 5000 triangles
  301. soit entièrement meilleure que celle du milieu avec seulement 480.</p>
  302. <p>Si vous ne dessinez que quelques sphères, comme par exemple un seul globe pour
  303. une carte de la terre, alors une seule sphère de 10000 triangles n'est pas un mauvais
  304. choix. Si par contre vous essayez de dessiner 1000 sphères, alors
  305. 1000 sphères multipliées par 10000 triangles chacune donnent 10 millions de triangles.
  306. Pour animer fluidement, vous avez besoin que le navigateur dessine à 60 images par
  307. seconde, donc vous demanderiez au navigateur de dessiner 600 millions de triangles
  308. par seconde. C'est beaucoup de calcul.</p>
  309. <p>Parfois, il est facile de choisir. Par exemple, vous pouvez également choisir
  310. de subdiviser un plan.</p>
  311. <div class="spread">
  312. <div data-diagram="PlaneGeometryLow"></div>
  313. <div data-diagram="PlaneGeometryHigh"></div>
  314. </div>
  315. <p>Le plan de gauche est composé de 2 triangles. Le plan de droite
  316. est composé de 200 triangles. Contrairement à la sphère, il n'y a vraiment aucun compromis sur la qualité pour la plupart
  317. des cas d'utilisation d'un plan. Vous ne subdiviseriez très probablement un plan
  318. que si vous vous attendiez à vouloir le modifier ou le déformer d'une manière ou d'une autre. Une boîte
  319. est similaire.</p>
  320. <p>Alors, choisissez ce qui convient le mieux à votre situation. Moins
  321. vous choisissez de subdivisions, plus il est probable que les choses fonctionneront fluidement et moins
  322. elles consommeront de mémoire. Vous devrez décider vous-même quel est le bon
  323. compromis pour votre situation particulière.</p>
  324. <p>Si aucune des formes ci-dessus ne correspond à votre cas d'utilisation, vous pouvez charger
  325. une géométrie, par exemple à partir d'un <a href="load-obj.html">fichier .obj</a>
  326. ou d'un <a href="load-gltf.html">fichier .gltf</a>.
  327. Vous pouvez également créer votre propre <a href="custom-buffergeometry.html">BufferGeometry personnalisée</a>.</p>
  328. <p>Ensuite, passons en revue <a href="scenegraph.html">le fonctionnement du graphe de scène de three et comment
  329. l'utiliser</a>.</p>
  330. <p><link rel="stylesheet" href="../resources/threejs-primitives.css"></p>
  331. <script type="module" src="../resources/threejs-primitives.js"></script>
  332. </div>
  333. </div>
  334. </div>
  335. <script defer src="../resources/prettify.js"></script>
  336. <script defer src="../resources/lesson.js"></script>
  337. </body></html>
粤ICP备19079148号