fog.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>Brouillard</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 – Brouillard">
  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>Brouillard</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 fondamentaux de three.js</a>. Si
  30. vous ne l'avez pas encore lu et que vous débutez avec three.js, vous devriez peut-être
  31. envisager de commencer par là. Si vous n'avez pas lu sur les caméras, vous voudrez peut-être
  32. commencer par <a href="cameras.html">cet article</a>.</p>
  33. <p>Le brouillard dans un moteur 3D est généralement une façon de s'estomper vers une couleur spécifique
  34. en fonction de la distance par rapport à la caméra. Dans three.js, vous ajoutez du brouillard en
  35. créant un objet <a href="/docs/#api/en/scenes/Fog"><code class="notranslate" translate="no">Fog</code></a> ou <a href="/docs/#api/en/scenes/FogExp2"><code class="notranslate" translate="no">FogExp2</code></a> et en le définissant sur la
  36. propriété <a href="/docs/#api/en/scenes/Scene#fog"><code class="notranslate" translate="no">fog</code></a> de la scène.</p>
  37. <p><a href="/docs/#api/en/scenes/Fog"><code class="notranslate" translate="no">Fog</code></a> vous permet de choisir les paramètres <code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code> qui sont des distances
  38. par rapport à la caméra. Tout ce qui est plus proche que <code class="notranslate" translate="no">near</code> n'est pas affecté par le brouillard.
  39. Tout ce qui est plus loin que <code class="notranslate" translate="no">far</code> prend complètement la couleur du brouillard. Les parties entre
  40. <code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code> s'estompent de leur couleur de matériau à la couleur du brouillard.</p>
  41. <p>Il y a aussi <a href="/docs/#api/en/scenes/FogExp2"><code class="notranslate" translate="no">FogExp2</code></a> qui augmente de manière exponentielle avec la distance par rapport à la caméra.</p>
  42. <p>Pour utiliser l'un ou l'autre type de brouillard, vous en créez un et l'attribuez à la scène comme dans</p>
  43. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  44. {
  45. const color = 0xFFFFFF; // white
  46. const near = 10;
  47. const far = 100;
  48. scene.fog = new THREE.Fog(color, near, far);
  49. }
  50. </pre>
  51. <p>ou pour <a href="/docs/#api/en/scenes/FogExp2"><code class="notranslate" translate="no">FogExp2</code></a> ce serait</p>
  52. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  53. {
  54. const color = 0xFFFFFF;
  55. const density = 0.1;
  56. scene.fog = new THREE.FogExp2(color, density);
  57. }
  58. </pre>
  59. <p><a href="/docs/#api/en/scenes/FogExp2"><code class="notranslate" translate="no">FogExp2</code></a> est plus proche de la réalité mais <a href="/docs/#api/en/scenes/Fog"><code class="notranslate" translate="no">Fog</code></a> est utilisé
  60. plus couramment car il vous permet de choisir un endroit où appliquer
  61. le brouillard afin que vous puissiez décider d'afficher une scène
  62. claire jusqu'à une certaine distance, puis de s'estomper vers une couleur
  63. au-delà de cette distance.</p>
  64. <div class="spread">
  65. <div>
  66. <div data-diagram="fog" style="height: 300px;"></div>
  67. <div class="code">THREE.Fog</div>
  68. </div>
  69. <div>
  70. <div data-diagram="fogExp2" style="height: 300px;"></div>
  71. <div class="code">THREE.FogExp2</div>
  72. </div>
  73. </div>
  74. <p>Il est important de noter que le brouillard est appliqué aux <em>choses qui sont rendues</em>.
  75. Il fait partie du calcul de chaque pixel de la couleur de l'objet.
  76. Cela signifie que si vous voulez que votre scène s'estompe vers une certaine couleur, vous
  77. devez définir le brouillard <strong>et</strong> la couleur de fond sur la même couleur.
  78. La couleur de fond est définie à l'aide de la
  79. propriété <a href="/docs/#api/en/scenes/Scene#background"><code class="notranslate" translate="no">scene.background</code></a>. Pour choisir une couleur de fond, vous y attachez un <a href="/docs/#api/en/math/Color"><code class="notranslate" translate="no">THREE.Color</code></a>. Par exemple</p>
  80. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">scene.background = new THREE.Color('#F00'); // rouge
  81. </pre>
  82. <div class="spread">
  83. <div>
  84. <div data-diagram="fogBlueBackgroundRed" style="height: 300px;" class="border"></div>
  85. <div class="code">brouillard bleu, fond rouge</div>
  86. </div>
  87. <div>
  88. <div data-diagram="fogBlueBackgroundBlue" style="height: 300px;" class="border"></div>
  89. <div class="code">brouillard bleu, fond bleu</div>
  90. </div>
  91. </div>
  92. <p>Voici l'un de nos exemples précédents avec l'ajout de brouillard. La seule addition
  93. est juste après la mise en place de la scène, nous ajoutons le brouillard et définissons la couleur de fond de la scène</p>
  94. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  95. +{
  96. + const near = 1;
  97. + const far = 2;
  98. + const color = 'lightblue';
  99. + scene.fog = new THREE.Fog(color, near, far);
  100. + scene.background = new THREE.Color(color);
  101. +}
  102. </pre>
  103. <p>Dans l'exemple ci-dessous, <code class="notranslate" translate="no">near</code> de la caméra est de 0.1 et <code class="notranslate" translate="no">far</code> est de 5.
  104. La caméra est à <code class="notranslate" translate="no">z = 2</code>. Les cubes mesurent 1 unité de large et sont à Z = 0.
  105. Cela signifie qu'avec un réglage de brouillard de <code class="notranslate" translate="no">near = 1</code> et <code class="notranslate" translate="no">far = 2</code>, les cubes
  106. s'estomperont juste autour de leur centre.</p>
  107. <p></p><div translate="no" class="threejs_example_container notranslate">
  108. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fog.html"></iframe></div>
  109. <a class="threejs_center" href="/manual/examples/fog.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  110. </div>
  111. <p></p>
  112. <p>Ajoutons une interface pour pouvoir ajuster le brouillard. Encore une fois, nous allons utiliser
  113. <a href="https://github.com/georgealways/lil-gui">lil-gui</a>. lil-gui prend
  114. un objet et une propriété et crée automatiquement une interface
  115. pour ce type de propriété. Nous pourrions simplement le laisser manipuler
  116. les propriétés <code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code> du brouillard, mais il est invalide d'avoir
  117. <code class="notranslate" translate="no">near</code> supérieur à <code class="notranslate" translate="no">far</code>, alors créons un assistant pour que lil-gui
  118. puisse manipuler une propriété <code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code>, mais nous nous assurerons que <code class="notranslate" translate="no">near</code>
  119. est inférieur ou égal à <code class="notranslate" translate="no">far</code> et que <code class="notranslate" translate="no">far</code> est supérieur ou égal à <code class="notulate" translate="no">near</code>.</p>
  120. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">// Nous utilisons cette classe pour la passer à lil-gui
  121. // ainsi quand elle manipule near ou far
  122. // near n'est jamais &gt; far et far n'est jamais &lt; near
  123. class FogGUIHelper {
  124. constructor(fog) {
  125. this.fog = fog;
  126. }
  127. get near() {
  128. return this.fog.near;
  129. }
  130. set near(v) {
  131. this.fog.near = v;
  132. this.fog.far = Math.max(this.fog.far, v);
  133. }
  134. get far() {
  135. return this.fog.far;
  136. }
  137. set far(v) {
  138. this.fog.far = v;
  139. this.fog.near = Math.min(this.fog.near, v);
  140. }
  141. }
  142. </pre>
  143. <p>Nous pouvons ensuite l'ajouter comme ceci</p>
  144. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  145. const near = 1;
  146. const far = 2;
  147. const color = 'lightblue';
  148. scene.fog = new THREE.Fog(color, near, far);
  149. scene.background = new THREE.Color(color);
  150. +
  151. + const fogGUIHelper = new FogGUIHelper(scene.fog);
  152. + gui.add(fogGUIHelper, 'near', near, far).listen();
  153. + gui.add(fogGUIHelper, 'far', near, far).listen();
  154. }
  155. </pre>
  156. <p>Les paramètres <code class="notranslate" translate="no">near</code> et <code class="notranslate" translate="no">far</code> définissent les valeurs minimum et maximum
  157. pour l'ajustement du brouillard. Ils sont définis lorsque nous configurons la caméra.</p>
  158. <p>Le <code class="notranslate" translate="no">.listen()</code> à la fin des 2 dernières lignes indique à lil-gui d'<em>écouter</em>
  159. les changements. De cette façon, lorsque nous changeons <code class="notranslate" translate="no">near</code> à cause d'une modification de <code class="notranslate" translate="no">far</code>
  160. ou que nous changeons <code class="notranslate" translate="no">far</code> en réponse à une modification de <code class="notranslate" translate="no">near</code>, lil-gui mettra à jour
  161. l'interface utilisateur de l'autre propriété pour nous.</p>
  162. <p>Il pourrait également être agréable de pouvoir changer la couleur du brouillard, mais comme mentionné
  163. ci-dessus, nous devons synchroniser la couleur du brouillard et la couleur de fond.
  164. Ajoutons donc une autre propriété <em>virtuelle</em> à notre assistant qui définira les deux couleurs
  165. lorsque lil-gui la manipulera.</p>
  166. <p>lil-gui peut manipuler les couleurs de 4 manières : comme une chaîne hexadécimale CSS à 6 chiffres (par exemple : <code class="notranslate" translate="no">#112233</code>). Comme un objet teinte, saturation, valeur (par exemple : <code class="notranslate" translate="no">{h: 60, s: 1, v: }</code>).
  167. Comme un tableau RGB (par exemple : <code class="notranslate" translate="no">[255, 128, 64]</code>). Ou, comme un tableau RGBA (par exemple : <code class="notranslate" translate="no">[127, 200, 75, 0.3]</code>).</p>
  168. <p>Le plus simple pour notre objectif est d'utiliser la version chaîne hexadécimale, car de cette façon,
  169. lil-gui ne manipule qu'une seule valeur. Heureusement, <a href="/docs/#api/en/math/Color"><code class="notranslate" translate="no">THREE.Color</code></a>
  170. dispose d'une méthode <a href="/docs/#api/en/math/Color#getHexString"><code class="notranslate" translate="no">getHexString</code></a> que nous pouvons utiliser pour obtenir facilement une telle chaîne,
  171. il suffit de faire précéder d'un '#' au début.</p>
  172. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">// Nous utilisons cette classe pour la passer à lil-gui
  173. // ainsi quand elle manipule near ou far
  174. // near n'est jamais &gt; far et far n'est jamais &lt; near
  175. // Aussi, lorsque lil-gui manipule la couleur, nous allons
  176. // mettre à jour les couleurs du brouillard et de l'arrière-plan.
  177. class FogGUIHelper {
  178. * constructor(fog, backgroundColor) {
  179. this.fog = fog;
  180. + this.backgroundColor = backgroundColor;
  181. }
  182. get near() {
  183. return this.fog.near;
  184. }
  185. set near(v) {
  186. this.fog.near = v;
  187. this.fog.far = Math.max(this.fog.far, v);
  188. }
  189. get far() {
  190. return this.fog.far;
  191. }
  192. set far(v) {
  193. this.fog.far = v;
  194. this.fog.near = Math.min(this.fog.near, v);
  195. }
  196. + get color() {
  197. + return `#${this.fog.color.getHexString()}`;
  198. + }
  199. + set color(hexString) {
  200. + this.fog.color.set(hexString);
  201. + this.backgroundColor.set(hexString);
  202. + }
  203. }
  204. </pre>
  205. <p>Nous appelons ensuite <code class="notranslate" translate="no">gui.addColor</code> pour ajouter une interface utilisateur de couleur pour la propriété virtuelle de notre assistant.</p>
  206. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  207. const near = 1;
  208. const far = 2;
  209. const color = 'lightblue';
  210. scene.fog = new THREE.Fog(color, near, far);
  211. scene.background = new THREE.Color(color);
  212. * const fogGUIHelper = new FogGUIHelper(scene.fog, scene.background);
  213. gui.add(fogGUIHelper, 'near', near, far).listen();
  214. gui.add(fogGUIHelper, 'far', near, far).listen();
  215. + gui.addColor(fogGUIHelper, 'color');
  216. }
  217. </pre>
  218. <p></p><div translate="no" class="threejs_example_container notranslate">
  219. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/fog-gui.html"></iframe></div>
  220. <a class="threejs_center" href="/manual/examples/fog-gui.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  221. </div>
  222. <p></p>
  223. <p>Vous pouvez voir que régler <code class="notranslate" translate="no">near</code> à environ 1.9 et <code class="notranslate" translate="no">far</code> à 2.0 donne
  224. une transition très nette entre non-brouillardé et complètement brouillardé.
  225. tandis que <code class="notranslate" translate="no">near</code> = 1.1 et <code class="notranslate" translate="no">far</code> = 2.9 devraient être à peu près
  226. les plus lisses étant donné que nos cubes tournent à 2 unités de distance de la caméra.</p>
  227. <p>Une dernière chose, il existe une propriété booléenne <a href="/docs/#api/en/materials/Material#fog"><code class="notranslate" translate="no">fog</code></a>
  228. sur un matériau indiquant si les objets rendus
  229. avec ce matériau sont affectés par le brouillard. Elle est par défaut à <code class="notranslate" translate="no">true</code>
  230. pour la plupart des matériaux. À titre d'exemple de pourquoi vous pourriez vouloir
  231. désactiver le brouillard, imaginez que vous créez un simulateur de véhicule 3D
  232. avec une vue depuis le siège du conducteur ou le cockpit.
  233. Vous voudrez probablement désactiver le brouillard pour tout ce qui se trouve à l'intérieur du véhicule lorsque
  234. vous regardez depuis l'intérieur du véhicule.</p>
  235. <p>Un meilleur exemple pourrait être une maison
  236. et un brouillard épais à l'extérieur. Disons que le brouillard est configuré pour commencer
  237. à 2 mètres de distance (<code class="notranslate" translate="no">near</code> = 2) et complètement brouillardé à 4 mètres (<code class="notranslate" translate="no">far</code> = 4).
  238. Les pièces sont plus longues que 2 mètres et la maison est probablement plus longue
  239. que 4 mètres, vous devez donc régler les matériaux de l'intérieur
  240. de la maison pour ne pas appliquer de brouillard, sinon, en vous tenant à l'intérieur
  241. de la maison et en regardant dehors le mur au fond de la pièce, cela aura l'air
  242. d'être dans le brouillard.</p>
  243. <div class="spread">
  244. <div>
  245. <div data-diagram="fogHouseAll" style="height: 300px;" class="border"></div>
  246. <div class="code">brouillard : vrai, tout</div>
  247. </div>
  248. </div>
  249. <p>Remarquez que les murs et le plafond au fond de la pièce sont affectés par le brouillard.
  250. En désactivant le brouillard sur les matériaux de la maison, nous pouvons corriger ce problème.</p>
  251. <div class="spread">
  252. <div>
  253. <div data-diagram="fogHouseInsideNoFog" style="height: 300px;" class="border"></div>
  254. <div class="code">brouillard : vrai, seulement les matériaux extérieurs</div>
  255. </div>
  256. </div>
  257. <p><canvas id="c"></canvas></p>
  258. <script type="module" src="../resources/threejs-fog.js"></script>
  259. </div>
  260. </div>
  261. </div>
  262. <script src="../resources/prettify.js"></script>
  263. <script src="../resources/lesson.js"></script>
  264. </body></html>
粤ICP备19079148号