lights.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>Lumières</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 – Lumières">
  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>Lumières</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 envisager de
  31. commencer par là, ainsi que l'article sur <a href="setup.html">la configuration de votre environnement</a>. Le
  32. <a href="textures.html">l'article précédent portait sur les textures</a>.</p>
  33. <p>Voyons comment utiliser les différents types de lumières dans three.js.</p>
  34. <p>En partant d'un de nos exemples précédents, mettons à jour la caméra.
  35. Nous définirons le champ de vision à 45 degrés, le plan lointain à 100 unités,
  36. et nous déplacerons la caméra de 10 unités vers le haut et de 20 unités vers l'arrière par rapport à l'origine</p>
  37. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">*const fov = 45;
  38. const aspect = 2; // the canvas default
  39. const near = 0.1;
  40. *const far = 100;
  41. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  42. +camera.position.set(0, 10, 20);
  43. </pre>
  44. <p>Ajoutons ensuite <a href="/docs/#examples/en/controls/OrbitControls" target="_blank"><code class="notranslate" translate="no">OrbitControls</code></a>. Les <a href="/docs/#examples/en/controls/OrbitControls" target="_blank"><code class="notranslate" translate="no">OrbitControls</code></a>
  45. permettent à l'utilisateur de faire tourner ou d'<em>orbiter</em> la caméra autour d'un point. Les <a href="/docs/#examples/en/controls/OrbitControls" target="_blank"><code class="notranslate" translate="no">OrbitControls</code></a>
  46. sont une fonctionnalité optionnelle de three.js, nous devons donc d'abord les inclure
  47. dans notre page</p>
  48. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">import * as THREE from 'three';
  49. +import {OrbitControls} from 'three/addons/controls/OrbitControls.js';
  50. </pre>
  51. <p>Ensuite, nous pouvons les utiliser. Nous passons aux <a href="/docs/#examples/en/controls/OrbitControls" target="_blank"><code class="notranslate" translate="no">OrbitControls</code></a> une caméra à
  52. contrôler et l'élément DOM à utiliser pour obtenir les événements d'entrée</p>
  53. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const controls = new OrbitControls(camera, canvas);
  54. controls.target.set(0, 5, 0);
  55. controls.update();
  56. </pre>
  57. <p>Nous définissons également la cible d'orbite à 5 unités au-dessus de l'origine
  58. et appelons ensuite <code class="notranslate" translate="no">controls.update</code> pour que les contrôles utilisent la nouvelle
  59. cible.</p>
  60. <p>Voyons ensuite comment créer des éléments à éclairer. D'abord, nous allons créer un
  61. plan au sol. Nous appliquerons une petite texture en damier de 2x2 pixels qui
  62. ressemble à ceci :</p>
  63. <div class="threejs_center">
  64. <img src="../examples/resources/images/checker.png" class="border" style="
  65. image-rendering: pixelated;
  66. width: 128px;
  67. " alt="">
  68. </div>
  69. <p>Nous chargeons d'abord la texture, la définissons en mode répétition, définissons le filtrage au
  70. plus proche, et définissons le nombre de fois que nous voulons qu'elle se répète. Étant donné que la
  71. texture est un damier de 2x2 pixels, en la répétant et en définissant la
  72. répétition à la moitié de la taille du plan, chaque case du damier
  73. aura exactement 1 unité de taille ;</p>
  74. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const planeSize = 40;
  75. const loader = new THREE.TextureLoader();
  76. const texture = loader.load('resources/images/checker.png');
  77. texture.wrapS = THREE.RepeatWrapping;
  78. texture.wrapT = THREE.RepeatWrapping;
  79. texture.magFilter = THREE.NearestFilter;
  80. texture.colorSpace = THREE.SRGBColorSpace;
  81. const repeats = planeSize / 2;
  82. texture.repeat.set(repeats, repeats);
  83. </pre>
  84. <p>Nous créons ensuite une géométrie de plan, un matériau pour le plan et un maillage
  85. pour l'insérer dans la scène. Les plans sont par défaut dans le plan XY,
  86. mais le sol est dans le plan XZ, nous le faisons donc pivoter.</p>
  87. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const planeGeo = new THREE.PlaneGeometry(planeSize, planeSize);
  88. const planeMat = new THREE.MeshPhongMaterial({
  89. map: texture,
  90. side: THREE.DoubleSide,
  91. });
  92. const mesh = new THREE.Mesh(planeGeo, planeMat);
  93. mesh.rotation.x = Math.PI * -.5;
  94. scene.add(mesh);
  95. </pre>
  96. <p>Ajoutons un cube et une sphère pour avoir 3 éléments à éclairer, y compris le plan.</p>
  97. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">{
  98. const cubeSize = 4;
  99. const cubeGeo = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);
  100. const cubeMat = new THREE.MeshPhongMaterial({color: '#8AC'});
  101. const mesh = new THREE.Mesh(cubeGeo, cubeMat);
  102. mesh.position.set(cubeSize + 1, cubeSize / 2, 0);
  103. scene.add(mesh);
  104. }
  105. {
  106. const sphereRadius = 3;
  107. const sphereWidthDivisions = 32;
  108. const sphereHeightDivisions = 16;
  109. const sphereGeo = new THREE.SphereGeometry(sphereRadius, sphereWidthDivisions, sphereHeightDivisions);
  110. const sphereMat = new THREE.MeshPhongMaterial({color: '#CA8'});
  111. const mesh = new THREE.Mesh(sphereGeo, sphereMat);
  112. mesh.position.set(-sphereRadius - 1, sphereRadius + 2, 0);
  113. scene.add(mesh);
  114. }
  115. </pre>
  116. <p>Maintenant que nous avons une scène à éclairer, ajoutons des lumières !</p>
  117. <h2 id="-ambientlight-"><a href="/docs/#api/en/lights/AmbientLight"><code class="notranslate" translate="no">AmbientLight</code></a></h2>
  118. <p>Commençons par créer une <a href="/docs/#api/en/lights/AmbientLight"><code class="notranslate" translate="no">Lumière Ambiante</code></a></p>
  119. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  120. const intensity = 1;
  121. const light = new THREE.AmbientLight(color, intensity);
  122. scene.add(light);
  123. </pre>
  124. <p>Faisons en sorte de pouvoir également ajuster les paramètres de la lumière.
  125. Nous utiliserons de nouveau <a href="https://github.com/georgealways/lil-gui">lil-gui</a>.
  126. Pour pouvoir ajuster la couleur via lil-gui, nous avons besoin d'un petit assistant
  127. qui présente une propriété à lil-gui qui ressemble à une chaîne de couleur hexadécimale CSS
  128. (par ex. : <code class="notranslate" translate="no">#FF8844</code>). Notre assistant obtiendra la couleur d'une propriété nommée,
  129. la convertira en chaîne hexadécimale pour l'offrir à lil-gui.
  130. Lorsque lil-gui essaiera de définir la propriété de l'assistant, nous assignerons le résultat à la
  131. couleur de la lumière.</p>
  132. <p>Voici l'assistant :</p>
  133. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">class ColorGUIHelper {
  134. constructor(object, prop) {
  135. this.object = object;
  136. this.prop = prop;
  137. }
  138. get value() {
  139. return `#${this.object[this.prop].getHexString()}`;
  140. }
  141. set value(hexString) {
  142. this.object[this.prop].set(hexString);
  143. }
  144. }
  145. </pre>
  146. <p>Et voici notre code de configuration de lil-gui</p>
  147. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const gui = new GUI();
  148. gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur');
  149. gui.add(light, 'intensity', 0, 5, 0.01);
  150. </pre>
  151. <p>Et voici le résultat</p>
  152. <p></p><div translate="no" class="threejs_example_container notranslate">
  153. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-ambient.html"></iframe></div>
  154. <a class="threejs_center" href="/manual/examples/lights-ambient.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  155. </div>
  156. <p></p>
  157. <p>Cliquez et faites glisser dans la scène pour faire <em>orbiter</em> la caméra.</p>
  158. <p>Remarquez qu'il n'y a pas de définition. Les formes sont plates. La <a href="/docs/#api/en/lights/AmbientLight"><code class="notranslate" translate="no">Lumière Ambiante</code></a>
  159. multiplie simplement la couleur du matériau par la couleur de la lumière multipliée par l'
  160. intensité.</p>
  161. <pre class="prettyprint showlinemods notranslate notranslate" translate="no">color = materialColor * light.color * light.intensity;
  162. </pre><p>C'est tout. Elle n'a pas de direction.
  163. Ce style d'éclairage ambiant n'est pas très utile en tant qu'éclairage car il est
  164. uniformément réparti, donc à part changer la couleur
  165. de tout dans la scène, il ne ressemble pas beaucoup à un <em>éclairage</em>.
  166. Ce qui aide, c'est qu'il rend les zones sombres moins sombres.</p>
  167. <h2 id="-hemispherelight-"><a href="/docs/#api/en/lights/HemisphereLight"><code class="notranslate" translate="no">HemisphereLight</code></a></h2>
  168. <p>Passons au code pour une <a href="/docs/#api/en/lights/HemisphereLight"><code class="notranslate" translate="no">Lumière Hémisphérique</code></a>. Une <a href="/docs/#api/en/lights/HemisphereLight"><code class="notranslate" translate="no">Lumière Hémisphérique</code></a>
  169. prend une couleur de ciel et une couleur de sol et multiplie simplement la
  170. couleur du matériau entre ces 2 couleurs — la couleur du ciel si la
  171. surface de l'objet pointe vers le haut et la couleur du sol si
  172. la surface de l'objet pointe vers le bas.</p>
  173. <p>Voici le nouveau code</p>
  174. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">-const color = 0xFFFFFF;
  175. +const skyColor = 0xB1E1FF; // light blue
  176. +const groundColor = 0xB97A20; // brownish orange
  177. const intensity = 1;
  178. -const light = new THREE.AmbientLight(color, intensity);
  179. +const light = new THREE.HemisphereLight(skyColor, groundColor, intensity);
  180. scene.add(light);
  181. </pre>
  182. <p>Mettons également à jour le code lil-gui pour éditer les deux couleurs</p>
  183. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const gui = new GUI();
  184. -gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('color');
  185. +gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur du ciel');
  186. +gui.addColor(new ColorGUIHelper(light, 'groundColor'), 'value').name('couleur du sol');
  187. gui.add(light, 'intensity', 0, 5, 0.01);
  188. </pre>
  189. <p>Le résultat :</p>
  190. <p></p><div translate="no" class="threejs_example_container notranslate">
  191. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-hemisphere.html"></iframe></div>
  192. <a class="threejs_center" href="/manual/examples/lights-hemisphere.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  193. </div>
  194. <p></p>
  195. <p>Remarquez de nouveau qu'il n'y a presque pas de définition, tout semble un peu
  196. plat. La <a href="/docs/#api/en/lights/HemisphereLight"><code class="notranslate" translate="no">Lumière Hémisphérique</code></a> utilisée en combinaison avec une autre lumière
  197. peut aider à donner une belle influence de la couleur du
  198. ciel et du sol. De cette façon, elle est mieux utilisée en combinaison avec une
  199. autre lumière ou en substitut d'une <a href="/docs/#api/en/lights/AmbientLight"><code class="notranslate" translate="no">Lumière Ambiante</code></a>.</p>
  200. <h2 id="-directionallight-"><a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">DirectionalLight</code></a></h2>
  201. <p>Passons au code pour une <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a>.
  202. Une <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a> est souvent utilisée pour représenter le soleil.</p>
  203. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  204. const intensity = 1;
  205. const light = new THREE.DirectionalLight(color, intensity);
  206. light.position.set(0, 10, 0);
  207. light.target.position.set(-5, 0, 0);
  208. scene.add(light);
  209. scene.add(light.target);
  210. </pre>
  211. <p>Remarquez que nous avons dû ajouter la <code class="notranslate" translate="no">light</code> et la <code class="notranslate" translate="no">light.target</code>
  212. à la scène. Une <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a> three.js
  213. brillera dans la direction de sa cible.</p>
  214. <p>Faisons en sorte de pouvoir déplacer la cible en l'ajoutant à
  215. notre interface GUI.</p>
  216. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const gui = new GUI();
  217. gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur');
  218. gui.add(light, 'intensity', 0, 5, 0.01);
  219. gui.add(light.target.position, 'x', -10, 10);
  220. gui.add(light.target.position, 'z', -10, 10);
  221. gui.add(light.target.position, 'y', 0, 10);
  222. </pre>
  223. <p></p><div translate="no" class="threejs_example_container notranslate">
  224. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-directional.html"></iframe></div>
  225. <a class="threejs_center" href="/manual/examples/lights-directional.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  226. </div>
  227. <p></p>
  228. <p>Il est un peu difficile de voir ce qui se passe. Three.js dispose d'un ensemble
  229. d'objets d'aide que nous pouvons ajouter à notre scène pour aider à visualiser
  230. les parties invisibles d'une scène. Dans ce cas, nous utiliserons le
  231. <a href="/docs/#api/en/helpers/DirectionalLightHelper"><code class="notranslate" translate="no">Helper de Lumière Directionnelle</code></a> qui dessinera un plan, pour représenter
  232. la lumière, et une ligne de la lumière à la cible. Nous lui
  233. passons simplement la lumière et l'ajoutons à la scène.</p>
  234. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const helper = new THREE.DirectionalLightHelper(light);
  235. scene.add(helper);
  236. </pre>
  237. <p>Pendant que nous y sommes, faisons en sorte de pouvoir définir à la fois la position
  238. de la lumière et la cible. Pour ce faire, nous allons créer une fonction
  239. qui, étant donné un <a href="/docs/#api/en/math/Vector3"><code class="notranslate" translate="no">Vector3</code></a>, ajustera ses propriétés <code class="notranslate" translate="no">x</code>, <code class="notranslate" translate="no">y</code>, et <code class="notranslate" translate="no">z</code>
  240. en utilisant <code class="notranslate" translate="no">lil-gui</code>.</p>
  241. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function makeXYZGUI(gui, vector3, name, onChangeFn) {
  242. const folder = gui.addFolder(name);
  243. folder.add(vector3, 'x', -10, 10).onChange(onChangeFn);
  244. folder.add(vector3, 'y', 0, 10).onChange(onChangeFn);
  245. folder.add(vector3, 'z', -10, 10).onChange(onChangeFn);
  246. folder.open();
  247. }
  248. </pre>
  249. <p>Notez que nous devons appeler la fonction <code class="notranslate" translate="no">update</code> de l'assistant
  250. chaque fois que nous changeons quelque chose afin que l'assistant sache qu'il doit se mettre à
  251. jour. Ainsi, nous passons une fonction <code class="notranslate" translate="no">onChangeFn</code> qui sera
  252. appelée chaque fois que lil-gui met à jour une valeur.</p>
  253. <p>Ensuite, nous pouvons l'utiliser à la fois pour la position de la lumière
  254. et pour la position de la cible, comme ceci</p>
  255. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">+function updateLight() {
  256. + light.target.updateMatrixWorld();
  257. + helper.update();
  258. +}
  259. +updateLight();
  260. const gui = new GUI();
  261. gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur');
  262. gui.add(light, 'intensity', 0, 5, 0.01);
  263. +makeXYZGUI(gui, light.position, 'position', updateLight);
  264. +makeXYZGUI(gui, light.target.position, 'cible', updateLight);
  265. </pre>
  266. <p>Nous pouvons maintenant déplacer la lumière, et sa cible</p>
  267. <p></p><div translate="no" class="threejs_example_container notranslate">
  268. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-directional-w-helper.html"></iframe></div>
  269. <a class="threejs_center" href="/manual/examples/lights-directional-w-helper.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  270. </div>
  271. <p></p>
  272. <p>Faites orbiter la caméra et il devient plus facile de voir. Le plan
  273. représente une <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a> car une lumière directionnelle
  274. calcule la lumière venant dans une seule direction. Il n'y a pas de
  275. <em>point</em> d'où la lumière provient, c'est un plan infini de lumière
  276. émettant des rayons parallèles.</p>
  277. <h2 id="-pointlight-"><a href="/docs/#api/en/lights/PointLight"><code class="notranslate" translate="no">PointLight</code></a></h2>
  278. <p>Une <a href="/docs/#api/en/lights/PointLight"><code class="notranslate" translate="no">Lumière Ponctuelle</code></a> est une lumière qui se situe à un point et projette de la lumière
  279. dans toutes les directions à partir de ce point. Modifions le code.</p>
  280. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  281. -const intensity = 1;
  282. +const intensity = 150;
  283. -const light = new THREE.DirectionalLight(color, intensity);
  284. +const light = new THREE.PointLight(color, intensity);
  285. light.position.set(0, 10, 0);
  286. -light.target.position.set(-5, 0, 0);
  287. scene.add(light);
  288. -scene.add(light.target);
  289. </pre>
  290. <p>Passons également à un <a href="/docs/#api/en/helpers/PointLightHelper"><code class="notranslate" translate="no">Helper de Lumière Ponctuelle</code></a></p>
  291. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">-const helper = new THREE.DirectionalLightHelper(light);
  292. +const helper = new THREE.PointLightHelper(light);
  293. scene.add(helper);
  294. </pre>
  295. <p>et comme il n'y a pas de cible, la fonction <code class="notranslate" translate="no">onChange</code> peut être plus simple.</p>
  296. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function updateLight() {
  297. - light.target.updateMatrixWorld();
  298. helper.update();
  299. }
  300. -updateLight();
  301. </pre>
  302. <p>Notez qu'à un certain niveau, un <a href="/docs/#api/en/helpers/PointLightHelper"><code class="notranslate" translate="no">Helper de Lumière Ponctuelle</code></a> n'a pas de... point.
  303. Il dessine simplement un petit losange en fil de fer. Cela pourrait tout aussi facilement
  304. être n'importe quelle forme que vous souhaitez, il suffit d'ajouter un maillage à la lumière elle-même.</p>
  305. <p>Une <a href="/docs/#api/en/lights/PointLight"><code class="notranslate" translate="no">Lumière Ponctuelle</code></a> a la propriété supplémentaire de <a href="/docs/#api/en/lights/PointLight#distance"><code class="notranslate" translate="no">distance</code></a>.
  306. Si la <code class="notranslate" translate="no">distance</code> est 0, alors la <a href="/docs/#api/en/lights/PointLight"><code class="notranslate" translate="no">Lumière Ponctuelle</code></a> brille à
  307. l'infini. Si la <code class="notranslate" translate="no">distance</code> est supérieure à 0, alors la lumière brille
  308. à pleine intensité au niveau de la lumière et s'estompe jusqu'à ne plus avoir d'influence à
  309. <code class="notranslate" translate="no">distance</code> unités de distance de la lumière.</p>
  310. <p>Configurons l'interface GUI pour que nous puissions ajuster la distance.</p>
  311. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const gui = new GUI();
  312. gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur');
  313. gui.add(light, 'intensity', 0, 250, 1);
  314. +gui.add(light, 'distance', 0, 40).onChange(updateLight);
  315. makeXYZGUI(gui, light.position, 'position', updateLight);
  316. -makeXYZGUI(gui, light.target.position, 'target', updateLight);
  317. </pre>
  318. <p>Et maintenant, essayez.</p>
  319. <p></p><div translate="no" class="threejs_example_container notranslate">
  320. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-point.html"></iframe></div>
  321. <a class="threejs_center" href="/manual/examples/lights-point.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  322. </div>
  323. <p></p>
  324. <p>Remarquez quand <code class="notranslate" translate="no">distance</code> est > 0 comment la lumière s'estompe.</p>
  325. <h2 id="-spotlight-"><a href="/docs/#api/en/lights/SpotLight"><code class="notranslate" translate="no">SpotLight</code></a></h2>
  326. <p>Les projecteurs sont effectivement une lumière ponctuelle avec un cône
  327. attaché où la lumière ne brille qu'à l'intérieur du cône.
  328. Il y a en fait 2 cônes. Un cône extérieur et un cône intérieur.
  329. Entre le cône intérieur et le cône extérieur, la
  330. lumière s'estompe de la pleine intensité à zéro.</p>
  331. <p>Pour utiliser une <a href="/docs/#api/en/lights/SpotLight"><code class="notranslate" translate="no">Projecteur</code></a>, nous avons besoin d'une cible, tout comme
  332. pour la lumière directionnelle. Le cône de la lumière s'ouvrira
  333. vers la cible.</p>
  334. <p>En modifiant notre <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a> avec l'assistant d'en haut</p>
  335. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  336. -const intensity = 1;
  337. +const intensity = 150;
  338. -const light = new THREE.DirectionalLight(color, intensity);
  339. +const light = new THREE.SpotLight(color, intensity);
  340. scene.add(light);
  341. scene.add(light.target);
  342. -const helper = new THREE.DirectionalLightHelper(light);
  343. +const helper = new THREE.SpotLightHelper(light);
  344. scene.add(helper);
  345. </pre>
  346. <p>L'angle du cône du projecteur est défini avec la propriété <a href="/docs/#api/en/lights/SpotLight#angle"><code class="notranslate" translate="no">angle</code></a>
  347. en radians. Nous utiliserons notre <code class="notranslate" translate="no">DegRadHelper</code> de l'<a href="textures.html">article sur les textures</a>
  348. pour présenter une interface utilisateur en
  349. degrés.</p>
  350. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">gui.add(new DegRadHelper(light, 'angle'), 'value', 0, 90).name('angle').onChange(updateLight);
  351. </pre>
  352. <p>Le cône intérieur est défini en réglant la propriété <a href="/docs/#api/en/lights/SpotLight#penumbra"><code class="notranslate" translate="no">pénombre</code></a>
  353. comme un pourcentage à partir du cône extérieur. En d'autres termes, quand <code class="notranslate" translate="no">penumbra</code> est 0, alors le
  354. cône intérieur a la même taille (0 = aucune différence) que le cône extérieur. Quand la
  355. <code class="notranslate" translate="no">penumbra</code> est 1, alors la lumière s'estompe en partant du centre du cône jusqu'au
  356. cône extérieur. Quand <code class="notranslate" translate="no">penumbra</code> est 0,5, alors la lumière s'estompe en partant de 50 % entre
  357. le centre du cône extérieur.</p>
  358. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">gui.add(light, 'penumbra', 0, 1, 0.01);
  359. </pre>
  360. <p></p><div translate="no" class="threejs_example_container notranslate">
  361. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-spot-w-helper.html"></iframe></div>
  362. <a class="threejs_center" href="/manual/examples/lights-spot-w-helper.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  363. </div>
  364. <p></p>
  365. <p>Remarquez qu'avec la <code class="notranslate" translate="no">penumbra</code> par défaut de 0, le projecteur a un bord très net,
  366. tandis que lorsque vous ajustez la <code class="notranslate" translate="no">penumbra</code> vers 1, le bord devient flou.</p>
  367. <p>Il peut être difficile de voir le <em>cône</em> du projecteur. La raison est qu'il est
  368. en dessous du sol. Raccourcissez la distance à environ 5 et vous verrez l'extrémité ouverte
  369. du cône.</p>
  370. <h2 id="-rectarealight-"><a href="/docs/#api/en/lights/RectAreaLight"><code class="notranslate" translate="no">RectAreaLight</code></a></h2>
  371. <p>Il existe un autre type de lumière, la <a href="/docs/#api/en/lights/RectAreaLight"><code class="notranslate" translate="no">Lumière Rectangulaire</code></a>, qui représente
  372. exactement ce à quoi cela ressemble : une zone rectangulaire de lumière, comme un long
  373. néon fluorescent ou peut-être une lucarne dépolie dans un plafond.</p>
  374. <p>La <a href="/docs/#api/en/lights/RectAreaLight"><code class="notranslate" translate="no">Lumière Rectangulaire</code></a> ne fonctionne qu'avec les matériaux <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a> et
  375. <a href="/docs/#api/en/materials/MeshPhysicalMaterial"><code class="notranslate" translate="no">MeshPhysicalMaterial</code></a>, nous allons donc changer tous nos matériaux en <a href="/docs/#api/en/materials/MeshStandardMaterial"><code class="notranslate" translate="no">MeshStandardMaterial</code></a></p>
  376. <pre class="prettyprint showlinemods notranslate lang-js" translate="no"> ...
  377. const planeGeo = new THREE.PlaneGeometry(planeSize, planeSize);
  378. - const planeMat = new THREE.MeshPhongMaterial({
  379. + const planeMat = new THREE.MeshStandardMaterial({
  380. map: texture,
  381. side: THREE.DoubleSide,
  382. });
  383. const mesh = new THREE.Mesh(planeGeo, planeMat);
  384. mesh.rotation.x = Math.PI * -.5;
  385. scene.add(mesh);
  386. }
  387. {
  388. const cubeSize = 4;
  389. const cubeGeo = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);
  390. - const cubeMat = new THREE.MeshPhongMaterial({color: '#8AC'});
  391. + const cubeMat = new THREE.MeshStandardMaterial({color: '#8AC'});
  392. const mesh = new THREE.Mesh(cubeGeo, cubeMat);
  393. mesh.position.set(cubeSize + 1, cubeSize / 2, 0);
  394. scene.add(mesh);
  395. }
  396. {
  397. const sphereRadius = 3;
  398. const sphereWidthDivisions = 32;
  399. const sphereHeightDivisions = 16;
  400. const sphereGeo = new THREE.SphereGeometry(sphereRadius, sphereWidthDivisions, sphereHeightDivisions);
  401. - const sphereMat = new THREE.MeshPhongMaterial({color: '#CA8'});
  402. + const sphereMat = new THREE.MeshStandardMaterial({color: '#CA8'});
  403. const mesh = new THREE.Mesh(sphereGeo, sphereMat);
  404. mesh.position.set(-sphereRadius - 1, sphereRadius + 2, 0);
  405. scene.add(mesh);
  406. }
  407. </pre>
  408. <p>Pour utiliser la <a href="/docs/#api/en/lights/RectAreaLight"><code class="notranslate" translate="no">Lumière Rectangulaire</code></a>, nous devons inclure des données optionnelles supplémentaires de three.js et nous inclurons le
  409. <a href="/docs/#api/en/helpers/RectAreaLightHelper"><code class="notranslate" translate="no">Helper de Lumière Rectangulaire</code></a> pour nous aider à visualiser la lumière</p>
  410. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">import * as THREE from 'three';
  411. +import {RectAreaLightUniformsLib} from 'three/addons/lights/RectAreaLightUniformsLib.js';
  412. +import {RectAreaLightHelper} from 'three/addons/helpers/RectAreaLightHelper.js';
  413. </pre>
  414. <p>et nous devons appeler <code class="notranslate" translate="no">RectAreaLightUniformsLib.init</code></p>
  415. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function main() {
  416. const canvas = document.querySelector('#c');
  417. const renderer = new THREE.WebGLRenderer({antialias: true, canvas});
  418. + RectAreaLightUniformsLib.init();
  419. </pre>
  420. <p>Si vous oubliez les données, la lumière fonctionnera toujours mais elle aura un aspect étrange, alors
  421. n'oubliez pas d'inclure les données supplémentaires.</p>
  422. <p>Nous pouvons maintenant créer la lumière</p>
  423. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const color = 0xFFFFFF;
  424. *const intensity = 5;
  425. +const width = 12;
  426. +const height = 4;
  427. *const light = new THREE.RectAreaLight(color, intensity, width, height);
  428. light.position.set(0, 10, 0);
  429. +light.rotation.x = THREE.MathUtils.degToRad(-90);
  430. scene.add(light);
  431. *const helper = new RectAreaLightHelper(light);
  432. *light.add(helper);
  433. </pre>
  434. <p>Une chose à noter est que, contrairement à la <a href="/docs/#api/en/lights/DirectionalLight"><code class="notranslate" translate="no">Lumière Directionnelle</code></a> et au <a href="/docs/#api/en/lights/SpotLight"><code class="notranslate" translate="no">Projecteur</code></a>, la
  435. <a href="/docs/#api/en/lights/RectAreaLight"><code class="notranslate" translate="no">Lumière Rectangulaire</code></a> n'utilise pas de cible. Elle utilise simplement sa rotation. Une autre chose
  436. à noter est que l'assistant doit être un enfant de la lumière. Il n'est pas un enfant de la
  437. scène comme les autres assistants.</p>
  438. <p>Ajustons également l'interface GUI. Nous allons faire en sorte de pouvoir faire pivoter la lumière et ajuster
  439. sa <code class="notranslate" translate="no">width</code> et sa <code class="notranslate" translate="no">height</code></p>
  440. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const gui = new GUI();
  441. gui.addColor(new ColorGUIHelper(light, 'color'), 'value').name('couleur');
  442. gui.add(light, 'intensity', 0, 10, 0.01);
  443. gui.add(light, 'width', 0, 20);
  444. gui.add(light, 'height', 0, 20);
  445. gui.add(new DegRadHelper(light.rotation, 'x'), 'value', -180, 180).name('rotation x');
  446. gui.add(new DegRadHelper(light.rotation, 'y'), 'value', -180, 180).name('rotation y');
  447. gui.add(new DegRadHelper(light.rotation, 'z'), 'value', -180, 180).name('rotation z');
  448. makeXYZGUI(gui, light.position, 'position');
  449. </pre>
  450. <p>Et voici cela.</p>
  451. <p></p><div translate="no" class="threejs_example_container notranslate">
  452. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/lights-rectarea.html"></iframe></div>
  453. <a class="threejs_center" href="/manual/examples/lights-rectarea.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  454. </div>
  455. <p></p>
  456. <p>Il est important de noter que chaque lumière que vous ajoutez à la scène ralentit la vitesse
  457. de rendu de la scène par three.js, vous devriez donc toujours essayer d'en
  458. utiliser le moins possible pour atteindre vos objectifs.</p>
  459. <p>Ensuite, passons à <a href="cameras.html">la gestion des caméras</a>.</p>
  460. <p><canvas id="c"></canvas></p>
  461. <script type="module" src="../resources/threejs-lights.js"></script>
  462. </div>
  463. </div>
  464. </div>
  465. <script src="../resources/prettify.js"></script>
  466. <script src="../resources/lesson.js"></script>
  467. </body></html>
粤ICP备19079148号