materials.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>Matériaux</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 – Matériaux">
  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>Matériaux</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. Le
  29. premier article est <a href="fundamentals.html">les bases de three.js</a>. Si
  30. vous ne l'avez pas encore lu et que vous débutez avec three.js, vous pourriez
  31. vouloir commencer par là.</p>
  32. <p>Three.js propose plusieurs types de matériaux.
  33. Ils définissent comment les objets apparaîtront dans la scène.
  34. Les matériaux que vous utilisez dépendent vraiment de ce que vous essayez
  35. d'accomplir.</p>
  36. <p>Il existe 2 manières de définir la plupart des propriétés des matériaux. L'une
  37. au moment de la création, ce que nous avons déjà vu.</p>
  38. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const material = new THREE.MeshPhongMaterial({
  39. color: 0xFF0000, // rouge (peut aussi utiliser une chaîne de couleur CSS ici)
  40. flatShading: true,
  41. });
  42. </pre>
  43. <p>L'autre est après la création</p>
  44. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const material = new THREE.MeshPhongMaterial();
  45. material.color.setHSL(0, 1, .5); // rouge
  46. material.flatShading = true;
  47. </pre>
  48. <p>notez que les propriétés de type <a href="/docs/#api/en/math/Color"><code class="notranslate" translate="no">THREE.Color</code></a> peuvent être définies de plusieurs manières.</p>
  49. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">material.color.set(0x00FFFF); // comme le style #RRGGBB de CSS
  50. material.color.set(cssString); // n'importe quelle couleur CSS, par exemple 'purple', '#F32',
  51. // 'rgb(255, 127, 64)',
  52. // 'hsl(180, 50%, 25%)'
  53. material.color.set(someColor) // une autre THREE.Color
  54. material.color.setHSL(h, s, l) // où h, s et l sont de 0 à 1
  55. material.color.setRGB(r, g, b) // où r, g et b sont de 0 à 1
  56. </pre>
  57. <p>Et au moment de la création, vous pouvez passer soit un nombre hexadécimal, soit une chaîne CSS</p>
  58. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const m1 = new THREE.MeshBasicMaterial({color: 0xFF0000}); // rouge
  59. const m2 = new THREE.MeshBasicMaterial({color: 'red'}); // rouge
  60. const m3 = new THREE.MeshBasicMaterial({color: '#F00'}); // rouge
  61. const m4 = new THREE.MeshBasicMaterial({color: 'rgb(255,0,0)'}); // rouge
  62. const m5 = new THREE.MeshBasicMaterial({color: 'hsl(0,100%,50%)'}); // rouge
  63. </pre>
  64. <p>Passons donc en revue l'ensemble des matériaux de three.js.</p>
  65. <p>Le <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a> n'est pas affecté par les lumières.</p>
  66. <p>Le <a href="/docs/#api/en/materials/MeshLambertMaterial"><code class="notranslate" translate="no">MeshLambertMaterial</code></a> calcule l'éclairage uniquement aux sommets, contrairement au <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> qui calcule l'éclairage à chaque pixel. Le <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a>
  67. prend également en charge les reflets spéculaires.</p>
  68. <div class="spread">
  69. <div>
  70. <div data-diagram="MeshBasicMaterial"></div>
  71. <div class="code">Basique</div>
  72. </div>
  73. <div>
  74. <div data-diagram="MeshLambertMaterial"></div>
  75. <div class="code">Lambert</div>
  76. </div>
  77. <div>
  78. <div data-diagram="MeshPhongMaterial"></div>
  79. <div class="code">Phong</div>
  80. </div>
  81. </div>
  82. <div class="spread">
  83. <div>
  84. <div data-diagram="MeshBasicMaterialLowPoly"></div>
  85. </div>
  86. <div>
  87. <div data-diagram="MeshLambertMaterialLowPoly"></div>
  88. </div>
  89. <div>
  90. <div data-diagram="MeshPhongMaterialLowPoly"></div>
  91. </div>
  92. </div>
  93. <div class="threejs_center code">modèles low-poly avec les mêmes matériaux</div>
  94. <p>Le paramètre <code class="notranslate" translate="no">shininess</code> du <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> détermine la <em>brillance</em> du reflet spéculaire. Par défaut, il est de 30.</p>
  95. <div class="spread">
  96. <div>
  97. <div data-diagram="MeshPhongMaterialShininess0"></div>
  98. <div class="code">shininess: 0</div>
  99. </div>
  100. <div>
  101. <div data-diagram="MeshPhongMaterialShininess30"></div>
  102. <div class="code">shininess: 30</div>
  103. </div>
  104. <div>
  105. <div data-diagram="MeshPhongMaterialShininess150"></div>
  106. <div class="code">shininess: 150</div>
  107. </div>
  108. </div>
  109. <p>Notez que définir la propriété <code class="notranslate" translate="no">emissive</code> sur une couleur pour un
  110. <a href="/docs/#api/en/materials/MeshLambertMaterial"><code class="notranslate" translate="no">MeshLambertMaterial</code></a> ou un <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> et définir la <code class="notranslate" translate="no">color</code> en noir
  111. (et <code class="notranslate" translate="no">shininess</code> à 0 pour phong) finit par ressembler exactement au <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a>.</p>
  112. <div class="spread">
  113. <div>
  114. <div data-diagram="MeshBasicMaterialCompare"></div>
  115. <div class="code">
  116. <div>Basique</div>
  117. <div>color: 'purple'</div>
  118. </div>
  119. </div>
  120. <div>
  121. <div data-diagram="MeshLambertMaterialCompare"></div>
  122. <div class="code">
  123. <div>Lambert</div>
  124. <div>color: 'black'</div>
  125. <div>emissive: 'purple'</div>
  126. </div>
  127. </div>
  128. <div>
  129. <div data-diagram="MeshPhongMaterialCompare"></div>
  130. <div class="code">
  131. <div>Phong</div>
  132. <div>color: 'black'</div>
  133. <div>emissive: 'purple'</div>
  134. <div>shininess: 0</div>
  135. </div>
  136. </div>
  137. </div>
  138. <p>Pourquoi avoir les 3 alors que <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> peut faire les mêmes choses que <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a>
  139. et <a href="/docs/#api/en/materials/MeshLambertMaterial"><code class="notranslate" translate="no">MeshLambertMaterial</code></a> ? La raison est que le matériau le plus sophistiqué
  140. nécessite plus de puissance GPU pour être dessiné. Sur un GPU plus lent,
  141. comme celui d'un téléphone portable, vous pourriez vouloir réduire la
  142. puissance GPU nécessaire pour dessiner votre scène en utilisant l'un des
  143. matériaux moins complexes. Il s'ensuit également que si vous n'avez pas
  144. besoin des fonctionnalités supplémentaires, utilisez le matériau le plus simple.
  145. Si vous n'avez pas besoin de l'éclairage et des reflets spéculaires,
  146. utilisez le <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a>.</p>
  147. <p>Le <a href="/docs/#api/en/materials/MeshToonMaterial"><code class="notranslate" translate="no">MeshToonMaterial</code></a> est similaire au <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a>
  148. avec une grande différence. Au lieu d'ombrer en douceur, il utilise une
  149. carte de dégradé (une texture de taille X sur 1) pour décider comment ombrer.
  150. Par défaut, il utilise une carte de dégradé dont la luminosité est de 70%
  151. pour les premiers 70% et de 100% ensuite, mais vous pouvez fournir votre
  152. propre carte de dégradé. Cela donne finalement un aspect bicolore qui
  153. ressemble à un dessin animé.</p>
  154. <div class="spread">
  155. <div data-diagram="MeshToonMaterial"></div>
  156. </div>
  157. <p>Ensuite, il y a 2 matériaux basés sur le <em>rendu physique</em>. Le Rendu Basé sur
  158. le Physique est souvent abrégé PBR.</p>
  159. <p>Les matériaux ci-dessus utilisent des calculs simples pour créer des matériaux
  160. qui semblent en 3D, mais ils ne correspondent pas à ce qui se passe réellement
  161. dans le monde réel. Les 2 matériaux PBR utilisent des calculs beaucoup plus
  162. complexes pour se rapprocher de ce qui se passe réellement dans le monde réel.</p>
  163. <p>Le premier est <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a>. La plus grande différence entre
  164. <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> et <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> est qu'il utilise différents paramètres.
  165. <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> avait un paramètre <code class="notranslate" translate="no">shininess</code>. <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> a 2
  166. paramètres : <code class="notranslate" translate="no">roughness</code> et <code class="notranslate" translate="no">metalness</code>.</p>
  167. <p>À un niveau basique, <a href="/docs/#api/en/materials/MeshStandardMaterial#roughness"><code class="notranslate" translate="no">roughness</code></a> est l'opposé
  168. de <code class="notranslate" translate="no">shininess</code>. Quelque chose qui a une rugosité élevée, comme une balle de baseball, n'a pas
  169. de reflets durs, tandis que quelque chose qui n'est pas rugueux, comme une boule de billard,
  170. est très brillant. La rugosité va de 0 à 1.</p>
  171. <p>L'autre paramètre, <a href="/docs/#api/en/materials/MeshStandardMaterial#metalness"><code class="notranslate" translate="no">metalness</code></a>, indique
  172. à quel point le matériau est métallique. Les métaux se comportent différemment des non-métaux. 0
  173. pour non-métal et 1 pour métal.</p>
  174. <p>Voici un échantillon rapide de <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> avec une <code class="notranslate" translate="no">roughness</code> de 0 à 1
  175. horizontalement et une <code class="notranslate" translate="no">metalness</code> de 0 à 1 verticalement.</p>
  176. <div data-diagram="MeshStandardMaterial" style="min-height: 400px"></div>
  177. <p>Le <a href="/docs/#api/en/materials/MeshPhysicalMaterial"><code class="notranslate" translate="no">MeshPhysicalMaterial</code></a> est le même que le <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> mais il
  178. ajoute un paramètre <code class="notranslate" translate="no">clearcoat</code> qui va de 0 à 1 pour déterminer la
  179. quantité de couche de vernis brillant à appliquer, et un paramètre
  180. <code class="notranslate" translate="no">clearCoatRoughness</code> qui spécifie la rugosité de la couche brillante.</p>
  181. <p>Voici la même grille de <code class="notranslate" translate="no">roughness</code> par <code class="notranslate" translate="no">metalness</code> que ci-dessus, mais avec
  182. les paramètres <code class="notranslate" translate="no">clearcoat</code> et <code class="notranslate" translate="no">clearCoatRoughness</code>.</p>
  183. <div data-diagram="MeshPhysicalMaterial" style="min-height: 400px"></div>
  184. <p>Les différents matériaux standard progressent du plus rapide au plus lent :
  185. <a href="/docs/#api/en/materials/MeshBasicMaterial"><code class="notranslate" translate="no">MeshBasicMaterial</code></a> ➡ <a href="/docs/#api/en/materials/MeshLambertMaterial"><code class="notranslate" translate="no">MeshLambertMaterial</code></a> ➡ <a href="/docs/#api/en/materials/MeshPhongMaterial"><code class="notranslate" translate="no">MeshPhongMaterial</code></a> ➡
  186. <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> ➡ <a href="/docs/#api/en/materials/MeshPhysicalMaterial"><code class="notranslate" translate="no">MeshPhysicalMaterial</code></a>. Les matériaux plus lents
  187. peuvent créer des scènes plus réalistes, mais vous pourriez avoir besoin de
  188. concevoir votre code pour utiliser les matériaux plus rapides sur les machines
  189. à faible puissance ou les appareils mobiles.</p>
  190. <p>Il existe 3 matériaux qui ont des utilisations spéciales. <a href="/docs/#api/en/materials/ShadowMaterial"><code class="notranslate" translate="no">ShadowMaterial</code></a>
  191. est utilisé pour obtenir les données créées par les ombres. Nous n'avons pas
  192. encore abordé les ombres. Lorsque ce sera le cas, nous utiliserons ce matériau
  193. pour jeter un coup d'œil à ce qui se passe en coulisse.</p>
  194. <p>Le <a href="/docs/#api/en/materials/MeshDepthMaterial"><code class="notranslate" translate="no">MeshDepthMaterial</code></a> affiche la profondeur de chaque pixel où
  195. les pixels au <a href="/docs/#api/en/cameras/PerspectiveCamera#near"><code class="notranslate" translate="no">near</code></a> négatif de la caméra sont 0 et au <a href="/docs/#api/en/cameras/PerspectiveCamera#far"><code class="notranslate" translate="no">far</code></a> négatif sont 1.
  196. Certains effets spéciaux peuvent utiliser ces données, que nous aborderons
  197. ultérieurement.</p>
  198. <div class="spread">
  199. <div>
  200. <div data-diagram="MeshDepthMaterial"></div>
  201. </div>
  202. </div>
  203. <p>Le <a href="/docs/#api/en/materials/MeshNormalMaterial"><code class="notranslate" translate="no">MeshNormalMaterial</code></a> vous montrera les <em>normales</em> de la géométrie.
  204. Les <em>normales</em> sont la direction vers laquelle pointe un triangle ou un pixel particulier.
  205. <a href="/docs/#api/en/materials/MeshNormalMaterial"><code class="notranslate" translate="no">MeshNormalMaterial</code></a> dessine les normales de l'espace de vue (les normales relatives à la caméra).
  206. <span style="background: red;" class="color">x est rouge</span>,
  207. <span style="background: green;" class="dark-color">y est vert</span>, et
  208. <span style="background: blue;" class="dark-color">z est bleu</span> donc les choses orientées
  209. vers la droite seront <span style="background: #FF7F7F;" class="color">roses</span>,
  210. vers la gauche seront <span style="background: #007F7F;" class="dark-color">aqua</span>,
  211. vers le haut seront <span style="background: #7FFF7F;" class="color">vert clair</span>,
  212. vers le bas seront <span style="background: #7F007F;" class="dark-color">violettes</span>,
  213. et vers l'écran seront <span style="background: #7F7FFF;" class="color">lavande</span>.</p>
  214. <div class="spread">
  215. <div>
  216. <div data-diagram="MeshNormalMaterial"></div>
  217. </div>
  218. </div>
  219. <p><a href="/docs/#api/en/materials/ShaderMaterial"><code class="notranslate" translate="no">ShaderMaterial</code></a> sert à créer des matériaux personnalisés à l'aide du système de shaders de three.js.
  220. <a href="/docs/#api/en/materials/RawShaderMaterial"><code class="notranslate" translate="no">RawShaderMaterial</code></a> sert à créer des shaders entièrement personnalisés sans aide de three.js.
  221. Ces deux sujets sont vastes et seront abordés plus tard.</p>
  222. <p>La plupart des matériaux partagent un ensemble de paramètres tous définis par <a href="/docs/#api/en/materials/Material"><code class="notranslate" translate="no">Material</code></a>.
  223. <a href="/docs/#api/en/materials/Material">Consultez la documentation</a>
  224. pour les voir tous, mais passons en revue deux des propriétés les plus couramment utilisées.</p>
  225. <p><a href="/docs/#api/en/materials/Material#flatShading"><code class="notranslate" translate="no">flatShading</code></a> :
  226. si l'objet semble facetté ou lisse. défaut = <code class="notranslate" translate="no">false</code>.</p>
  227. <div class="spread">
  228. <div>
  229. <div data-diagram="smoothShading"></div>
  230. <div class="code">flatShading: false</div>
  231. </div>
  232. <div>
  233. <div data-diagram="flatShading"></div>
  234. <div class="code">flatShading: true</div>
  235. </div>
  236. </div>
  237. <p><a href="/docs/#api/en/materials/Material#side"><code class="notranslate" translate="no">side</code></a> : quels côtés des triangles afficher. La valeur par défaut est <code class="notranslate" translate="no">THREE.FrontSide</code>.
  238. Les autres options sont <code class="notranslate" translate="no">THREE.BackSide</code> et <code class="notranslate" translate="no">THREE.DoubleSide</code> (les deux côtés).
  239. La plupart des objets 3D dessinés dans three.js sont probablement des solides opaques, donc les faces arrière
  240. (les faces tournées vers l'intérieur du solide) n'ont pas besoin d'être dessinées. La raison la plus courante
  241. de définir <code class="notranslate" translate="no">side</code> est pour les plans ou d'autres objets non solides où il est
  242. courant de voir les faces arrière des triangles.</p>
  243. <p>Voici 6 plans dessinés avec <code class="notranslate" translate="no">THREE.FrontSide</code> et <code class="notranslate" translate="no">THREE.DoubleSide</code>.</p>
  244. <div class="spread">
  245. <div>
  246. <div data-diagram="sideDefault" style="height: 250px;"></div>
  247. <div class="code">side: THREE.FrontSide</div>
  248. </div>
  249. <div>
  250. <div data-diagram="sideDouble" style="height: 250px;"></div>
  251. <div class="code">side: THREE.DoubleSide</div>
  252. </div>
  253. </div>
  254. <p>Il y a vraiment beaucoup de choses à considérer avec les matériaux et nous en avons encore beaucoup
  255. à voir. En particulier, nous avons largement ignoré les textures qui ouvrent tout un éventail
  256. d'options. Cependant, avant d'aborder les textures, nous devons faire une pause et
  257. <a href="setup.html">configurer votre environnement de développement</a>.</p>
  258. <div class="threejs_bottombar">
  259. <h3>material.needsUpdate</h3>
  260. <p>
  261. Ce sujet affecte rarement la plupart des applications three.js, mais juste pour information...
  262. Three.js applique les paramètres des matériaux lorsqu'un matériau est utilisé, où "utilisé"
  263. signifie "quelque chose qui est rendu utilise le matériau". Certains paramètres de matériau ne sont
  264. appliqués qu'une seule fois, car leur modification nécessite beaucoup de travail de la part de three.js.
  265. Dans ces cas, vous devez définir <code class="notranslate" translate="no">material.needsUpdate = true</code> pour indiquer à
  266. three.js d'appliquer vos modifications de matériau. Les paramètres les plus courants
  267. qui nécessitent de définir <code class="notranslate" translate="no">needsUpdate</code> si vous modifiez les paramètres après avoir
  268. utilisé le matériau sont :
  269. </p>
  270. <ul>
  271. <li><code class="notranslate" translate="no">flatShading</code></li>
  272. <li>ajout ou suppression d'une texture
  273. <p>
  274. Changer une texture est acceptable, mais si vous souhaitez passer de l'absence de texture
  275. à l'utilisation d'une texture, ou de l'utilisation d'une texture à l'absence de texture,
  276. alors vous devez définir <code class="notranslate" translate="no">needsUpdate = true</code>.
  277. </p>
  278. <p>Dans le cas où l'on passe d'une texture à l'absence de texture, il est souvent
  279. simplement préférable d'utiliser une texture blanche de 1x1 pixel.</p>
  280. </li>
  281. </ul>
  282. <p>Comme mentionné ci-dessus, la plupart des applications ne rencontrent jamais ces problèmes. La plupart des applications
  283. ne basculent pas entre un ombrage plat et non plat. La plupart des applications
  284. utilisent également des textures ou une couleur unie pour un matériau donné ; elles basculent rarement
  285. de l'utilisation de l'un à l'utilisation de l'autre.
  286. </p>
  287. </div>
  288. <p><canvas id="c"></canvas></p>
  289. <script type="module" src="../resources/threejs-materials.js"></script>
  290. </div>
  291. </div>
  292. </div>
  293. <script src="../resources/prettify.js"></script>
  294. <script src="../resources/lesson.js"></script>
  295. </body></html>
粤ICP备19079148号