webxr-basics.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <!DOCTYPE html><html lang="fr"><head>
  2. <meta charset="utf-8">
  3. <title>RV</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 – VR">
  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>RV</h1>
  25. </div>
  26. <div class="lesson">
  27. <div class="lesson-main">
  28. <p>Créer une application RV dans three.js est assez simple. Il suffit essentiellement de dire à
  29. three.js que vous souhaitez utiliser WebXR. Si vous y réfléchissez, quelques points concernant WebXR
  30. devraient être clairs. La direction vers laquelle la caméra pointe est fournie par le système RV
  31. lui-même, puisque l'utilisateur tourne la tête pour choisir une direction à regarder. De même,
  32. le champ de vision et l'aspect seront fournis par le système RV, car chaque système a un champ
  33. de vision et un aspect d'affichage différents.</p>
  34. <p>Prenons un exemple de l'article sur <a href="responsive.html">la création d'une page web responsive</a>
  35. et rendons-le compatible avec la RV.</p>
  36. <p>Avant de commencer, vous aurez besoin d'un dispositif compatible RV comme un smartphone Android,
  37. Google Daydream, Oculus Go, Oculus Rift, Vive, Samsung Gear VR, un iPhone avec un
  38. <a href="https://apps.apple.com/us/app/webxr-viewer/id1295998056">navigateur WebXR</a>.</p>
  39. <p>Ensuite, si vous exécutez localement, vous devez exécuter un simple serveur web, comme
  40. expliqué dans <a href="setup.html">l'article sur la configuration</a>.</p>
  41. <p>Si l'appareil que vous utilisez pour visualiser la RV n'est pas le même ordinateur sur lequel vous
  42. exécutez, vous devez servir votre page web via https, sinon le navigateur ne permettra pas d'utiliser
  43. l'API WebXR. Le serveur mentionné dans <a href="setup.html">l'article sur la configuration</a>
  44. appelé <a href="https://greggman.github.io/servez" target="_blank">Servez</a> a une option pour utiliser https.
  45. Cochez-le et démarrez le serveur.</p>
  46. <div class="threejs_center"><img src="../resources/images/servez-https.png" class="nobg" style="width: 912px;"></div>
  47. <p>Notez les URL. Vous avez besoin de celle qui correspond à l'adresse IP locale de votre ordinateur.
  48. Elle commencera généralement par <code class="notranslate" translate="no">192</code>, <code class="notranslate" translate="no">172</code> ou <code class="notranslate" translate="no">10</code>. Saisissez cette adresse complète, y compris la partie <code class="notranslate" translate="no">https://</code>
  49. dans le navigateur de votre appareil RV. Note : Votre ordinateur et votre appareil RV doivent être sur le même réseau local
  50. ou WiFi, et vous devez probablement être sur un réseau domestique. note : De nombreux cafés sont configurés pour interdire ce type
  51. de connexion machine à machine.</p>
  52. <p>Vous serez accueilli par une erreur ressemblant à celle ci-dessous. Cliquez sur "avancé" puis cliquez sur
  53. <em>continuer</em>.</p>
  54. <div class="threejs_center"><img src="../resources/images/https-warning.gif"></div>
  55. <p>Vous pouvez maintenant exécuter vos exemples.</p>
  56. <p>Si vous vous lancez vraiment dans le développement WebXR, une autre chose que vous devriez apprendre est
  57. <a href="https://developers.google.com/web/tools/chrome-devtools/remote-debugging/">le débogage à distance</a>
  58. afin de pouvoir voir les avertissements, les erreurs de console, et bien sûr, réellement
  59. <a href="debugging-javascript.html">déboguer votre code</a>.</p>
  60. <p>Si vous voulez juste voir le code fonctionner ci-dessous, vous pouvez simplement exécuter le code depuis
  61. ce site.</p>
  62. <p>La première chose à faire est d'inclure le support RV après
  63. avoir inclus three.js</p>
  64. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">import * as THREE from 'three';
  65. +import {VRButton} from 'three/addons/webxr/VRButton.js';
  66. </pre>
  67. <p>Ensuite, nous devons activer le support WebXR de three.js et ajouter son
  68. bouton RV à notre page</p>
  69. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function main() {
  70. const canvas = document.querySelector('#c');
  71. const renderer = new THREE.WebGLRenderer({antialias: true, canvas});
  72. + renderer.xr.enabled = true;
  73. + document.body.appendChild(VRButton.createButton(renderer));
  74. </pre>
  75. <p>Nous devons laisser three.js exécuter notre boucle de rendu. Jusqu'à présent, nous avons utilisé une
  76. boucle <code class="notranslate" translate="no">requestAnimationFrame</code>, mais pour supporter la RV, nous devons laisser three.js gérer
  77. notre boucle de rendu pour nous. Nous pouvons le faire en appelant
  78. <a href="/docs/#api/en/renderers/WebGLRenderer.setAnimationLoop"><code class="notranslate" translate="no">WebGLRenderer.setAnimationLoop</code></a> et en passant une fonction à appeler pour la boucle.</p>
  79. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function render(time) {
  80. time *= 0.001;
  81. if (resizeRendererToDisplaySize(renderer)) {
  82. const canvas = renderer.domElement;
  83. camera.aspect = canvas.clientWidth / canvas.clientHeight;
  84. camera.updateProjectionMatrix();
  85. }
  86. cubes.forEach((cube, ndx) =&gt; {
  87. const speed = 1 + ndx * .1;
  88. const rot = time * speed;
  89. cube.rotation.x = rot;
  90. cube.rotation.y = rot;
  91. });
  92. renderer.render(scene, camera);
  93. - requestAnimationFrame(render);
  94. }
  95. -requestAnimationFrame(render);
  96. +renderer.setAnimationLoop(render);
  97. </pre>
  98. <p>Il y a un détail de plus. Nous devrions probablement définir une hauteur de caméra
  99. qui soit à peu près moyenne pour un utilisateur debout.</p>
  100. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  101. +camera.position.set(0, 1.6, 0);
  102. </pre>
  103. <p>et déplacer les cubes pour qu'ils soient devant la caméra</p>
  104. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const cube = new THREE.Mesh(geometry, material);
  105. scene.add(cube);
  106. cube.position.x = x;
  107. +cube.position.y = 1.6;
  108. +cube.position.z = -2;
  109. </pre>
  110. <p>Nous les avons définis à <code class="notranslate" translate="no">z = -2</code> car la caméra sera maintenant à <code class="notranslate" translate="no">z = 0</code> et
  111. la caméra par défaut regarde vers l'axe -z.</p>
  112. <p>Cela soulève un point extrêmement important. <strong>Les unités en RV sont des mètres</strong>.
  113. En d'autres termes, <strong>Une Unité = Un Mètre</strong>. Cela signifie que la caméra est à 1,6 mètres au-dessus de 0.
  114. Les centres des cubes sont à 2 mètres devant la caméra. Chaque cube
  115. a une taille de 1x1x1 mètre. C'est important car la RV doit ajuster les choses à l'utilisateur
  116. <em>dans le monde réel</em>. Cela signifie que les unités utilisées dans three.js doivent correspondre
  117. aux mouvements de l'utilisateur lui-même.</p>
  118. <p>Et avec cela, nous devrions obtenir 3 cubes tournant devant
  119. la caméra avec un bouton pour entrer en RV.</p>
  120. <p></p><div translate="no" class="threejs_example_container notranslate">
  121. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/webxr-basic.html"></iframe></div>
  122. <a class="threejs_center" href="/manual/examples/webxr-basic.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  123. </div>
  124. <p></p>
  125. <p>Je trouve que la RV fonctionne mieux si nous avons quelque chose entourant la caméra, comme
  126. une pièce pour référence, alors ajoutons une simple cubemap en grille comme nous l'avons vu dans
  127. <a href="backgrounds.html">l'article sur les arrière-plans</a>. Nous utiliserons simplement la même texture de grille
  128. pour chaque côté du cube, ce qui donnera une salle en grille.</p>
  129. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">const scene = new THREE.Scene();
  130. +{
  131. + const loader = new THREE.CubeTextureLoader();
  132. + const texture = loader.load([
  133. + 'resources/images/grid-1024.png',
  134. + 'resources/images/grid-1024.png',
  135. + 'resources/images/grid-1024.png',
  136. + 'resources/images/grid-1024.png',
  137. + 'resources/images/grid-1024.png',
  138. + 'resources/images/grid-1024.png',
  139. + ]);
  140. + scene.background = texture;
  141. +}
  142. </pre>
  143. <p>C'est mieux.</p>
  144. <p></p><div translate="no" class="threejs_example_container notranslate">
  145. <div><iframe class="threejs_example notranslate" translate="no" style=" " src="/manual/examples/resources/editor.html?url=/manual/examples/webxr-basic-w-background.html"></iframe></div>
  146. <a class="threejs_center" href="/manual/examples/webxr-basic-w-background.html" target="_blank">cliquez ici pour ouvrir dans une fenêtre séparée</a>
  147. </div>
  148. <p></p>
  149. <p>Note : Pour voir réellement la RV, vous aurez besoin d'un appareil compatible WebXR.
  150. Je crois que la plupart des téléphones Android peuvent supporter WebXR en utilisant Chrome ou Firefox.
  151. Pour iOS, vous pourriez pouvoir utiliser cette <a href="https://apps.apple.com/us/app/webxr-viewer/id1295998056">application WebXR</a>,
  152. bien qu'en général, le support WebXR sur iOS ne soit pas supporté en mai 2019.</p>
  153. <p>Pour utiliser WebXR sur Android ou iPhone, vous aurez besoin d'un <em>Casque RV</em>
  154. pour téléphones. Vous pouvez en trouver entre 5$ pour un fait de carton
  155. et 100$. Malheureusement, je ne sais pas lesquels recommander. J'en ai acheté
  156. 6 au fil des ans et ils sont tous de qualité variable. Je n'ai
  157. jamais payé plus d'environ 25$.</p>
  158. <p>Juste pour mentionner quelques-uns des problèmes</p>
  159. <ol>
  160. <li><p>Sont-ils compatibles avec votre téléphone</p>
  161. <p>Les téléphones existent en différentes tailles et les casques RV doivent donc correspondre.
  162. De nombreux casques prétendent correspondre à une grande variété de tailles. Mon expérience
  163. est que plus ils correspondent à de tailles, moins ils sont performants, car au lieu
  164. d'être conçus pour une taille spécifique, ils doivent faire des compromis
  165. pour correspondre à plus de tailles. Malheureusement, les casques multi-tailles sont le type le plus courant.</p>
  166. </li>
  167. <li><p>Peuvent-ils faire la mise au point pour votre visage</p>
  168. <p>Certains appareils ont plus d'ajustements que d'autres. Généralement, il y a
  169. au maximum 2 ajustements. La distance entre les lentilles et vos yeux
  170. et la distance entre les lentilles.</p>
  171. </li>
  172. <li><p>Sont-ils trop réfléchissants</p>
  173. <p>De nombreux casques ont un cône en plastique entre votre œil et le téléphone.
  174. Si ce plastique est brillant ou réfléchissant, il agira comme
  175. un miroir reflétant l'écran et sera très distrayant.</p>
  176. <p>Peu de critiques, voire aucune, ne semblent couvrir ce problème.</p>
  177. </li>
  178. <li><p>Sont-ils confortables sur votre visage.</p>
  179. <p>La plupart des appareils reposent sur votre nez comme une paire de lunettes.
  180. Cela peut faire mal après quelques minutes. Certains ont des sangles qui passent
  181. autour de votre tête. D'autres ont une 3ème sangle qui passe par-dessus votre tête. Cela
  182. peut aider ou non à maintenir l'appareil au bon endroit.</p>
  183. <p>Il s'avère que pour la plupart (tous ?) des appareils, vos yeux doivent être centrés
  184. avec les lentilles. Si les lentilles sont légèrement au-dessus ou en dessous de vos
  185. yeux, l'image devient floue. Cela peut être très frustrant
  186. car les choses peuvent commencer nettes, mais 45 à 60 secondes plus tard, l'appareil
  187. s'est déplacé de 1 millimètre vers le haut ou vers le bas et vous réalisez soudain que vous avez
  188. lutté pour faire la mise au point sur une image floue.</p>
  189. </li>
  190. <li><p>Sont-ils compatibles avec vos lunettes.</p>
  191. <p>Si vous portez des lunettes, vous devrez lire les critiques pour voir
  192. si un casque particulier fonctionne bien avec les lunettes.</p>
  193. </li>
  194. </ol>
  195. <p>Je ne peux vraiment pas faire de recommandations malheureusement. <a href="https://vr.google.com/cardboard/get-cardboard/">Google propose quelques recommandations
  196. bon marché faites en carton</a>,
  197. certains à partir de 5$, alors peut-être commencer par là et si vous aimez,
  198. envisagez de passer à la vitesse supérieure. 5$ c'est le prix d'un café, alors sérieusement, essayez !</p>
  199. <p>Il existe également 3 types de dispositifs de base.</p>
  200. <ol>
  201. <li><p>3 degrés de liberté (3dof), pas de dispositif d'entrée</p>
  202. <p>C'est généralement le style téléphone, bien que parfois vous puissiez
  203. acheter un dispositif d'entrée tiers. Les 3 degrés de liberté
  204. signifient que vous pouvez regarder vers le haut/bas (1), gauche/droite (2) et que vous pouvez incliner
  205. la tête gauche et droite (3).</p>
  206. </li>
  207. <li><p>3 degrés de liberté (3dof) avec 1 dispositif d'entrée (3dof)</p>
  208. <p>C'est fondamentalement Google Daydream et Oculus GO</p>
  209. <p>Ceux-ci permettent également 3 degrés de liberté et incluent un petit
  210. contrôleur qui agit comme un pointeur laser dans la RV.
  211. Le pointeur laser n'a également que 3 degrés de liberté. Le
  212. système peut dire dans quelle direction le dispositif d'entrée pointe, mais
  213. il ne peut pas dire où se trouve le dispositif.</p>
  214. </li>
  215. <li><p>6 degrés de liberté (6dof) avec dispositifs d'entrée (6dof)</p>
  216. <p>Ceux-ci sont <em>le vrai truc</em> haha. 6 degrés de liberté
  217. signifie que non seulement ces appareils savent dans quelle direction vous regardez,
  218. mais ils savent aussi où se trouve réellement votre tête. Cela signifie que
  219. si vous vous déplacez de gauche à droite ou d'avant en arrière ou si vous vous levez / vous asseyez,
  220. les appareils peuvent enregistrer cela et tout dans la RV se déplace en conséquence.
  221. C'est incroyablement et étonnamment réaliste. Avec une bonne démo,
  222. vous serez époustouflé, ou du moins je l'ai été et je le suis toujours.</p>
  223. <p>De plus, ces appareils incluent généralement 2 contrôleurs, un
  224. pour chaque main, et le système peut dire exactement où se trouvent vos
  225. mains et dans quelle orientation elles sont, de sorte que vous pouvez
  226. manipuler des choses en RV en tendant simplement la main, touchant,
  227. poussant, tournant, etc...</p>
  228. <p>Les appareils à 6 degrés de liberté incluent le Vive et Vive Pro,
  229. l'Oculus Rift et Quest, et je crois tous les appareils Windows MR.</p>
  230. </li>
  231. </ol>
  232. <p>Avec tout cela couvert, je ne sais pas avec certitude quels appareils fonctionneront avec WebXR.
  233. Je suis sûr à 99% que la plupart des téléphones Android fonctionneront avec Chrome. Vous pourriez
  234. avoir besoin d'activer le support WebXR dans <a href="about:flags"><code class="notranslate" translate="no">about:flags</code></a>. Je sais aussi que Google
  235. Daydream fonctionnera également et de même, vous devez activer le support WebXR dans
  236. <a href="about:flags"><code class="notranslate" translate="no">about:flags</code></a>. Oculus Rift, Vive et Vive Pro fonctionneront via
  237. Chrome ou Firefox. Je suis moins sûr pour Oculus Go et Oculus Quest car les deux
  238. utilisent des systèmes d'exploitation personnalisés, mais selon Internet, ils semblent tous deux fonctionner.</p>
  239. <p>Bien, après cette longue digression sur les dispositifs RV et WebXR, il y a certaines choses à couvrir</p>
  240. <ul>
  241. <li><p>Prise en charge de la RV et de la non-RV</p>
  242. <p>Pour autant que je sache, du moins depuis la version r112, il n'y a pas de moyen simple de prendre en charge
  243. les modes RV et non-RV avec three.js. Idéalement,
  244. si vous n'êtes pas en mode RV, vous devriez pouvoir contrôler la caméra en utilisant
  245. les moyens que vous souhaitez, par exemple les <a href="/docs/#examples/controls/OrbitControls"><code class="notranslate" translate="no">OrbitControls</code></a>,
  246. et vous devriez obtenir un événement lors du passage en mode RV et
  247. de la sortie du mode RV afin que vous puissiez activer/désactiver les contrôles.</p>
  248. </li>
  249. </ul>
  250. <p>Si three.js ajoute un support pour faire les deux, j'essaierai de mettre à jour
  251. cet article. En attendant, vous pourriez avoir besoin de 2 versions de votre
  252. site OU de passer un drapeau dans l'URL, quelque chose comme</p>
  253. <pre class="prettyprint showlinemods notranslate notranslate" translate="no">https://mysite.com/mycooldemo?allowvr=true
  254. </pre><p>Alors nous pourrions ajouter des liens pour changer de mode</p>
  255. <pre class="prettyprint showlinemods notranslate lang-html" translate="no">&lt;body&gt;
  256. &lt;canvas id="c"&gt;&lt;/canvas&gt;
  257. + &lt;div class="mode"&gt;
  258. + &lt;a href="?allowvr=true" id="vr"&gt;Autoriser la RV&lt;/a&gt;
  259. + &lt;a href="?" id="nonvr"&gt;Utiliser le mode non-RV&lt;/a&gt;
  260. + &lt;/div&gt;
  261. &lt;/body&gt;
  262. </pre>
  263. <p>et du CSS pour les positionner</p>
  264. <pre class="prettyprint showlinemods notranslate lang-css" translate="no">body {
  265. margin: 0;
  266. }
  267. #c {
  268. width: 100%;
  269. height: 100%;
  270. display: block;
  271. }
  272. +.mode {
  273. + position: absolute;
  274. + right: 1em;
  275. + top: 1em;
  276. +}
  277. </pre>
  278. <p>dans votre code, vous pourriez utiliser ce paramètre comme ceci</p>
  279. <pre class="prettyprint showlinemods notranslate lang-js" translate="no">function main() {
  280. const canvas = document.querySelector('#c');
  281. const renderer = new THREE.WebGLRenderer({antialias: true, canvas});
  282. - renderer.xr.enabled = true;
  283. - document.body.appendChild(VRButton.createButton(renderer));
  284. const fov = 75;
  285. const aspect = 2; // the canvas default
  286. const near = 0.1;
  287. const far = 5;
  288. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  289. camera.position.set(0, 1.6, 0);
  290. + const params = (new URL(document.location)).searchParams;
  291. + const allowvr = params.get('allowvr') === 'true';
  292. + if (allowvr) {
  293. + renderer.xr.enabled = true;
  294. + document.body.appendChild(VRButton.createButton(renderer));
  295. + document.querySelector('#vr').style.display = 'none';
  296. + } else {
  297. + // no VR, add some controls
  298. + const controls = new OrbitControls(camera, canvas);
  299. + controls.target.set(0, 1.6, -2);
  300. + controls.update();
  301. + document.querySelector('#nonvr').style.display = 'none';
  302. + }
  303. </pre>
  304. <p>Que ce soit bon ou mauvais, je ne sais pas. J'ai l'impression que les différences
  305. entre ce qui est nécessaire pour la RV et ce qui est nécessaire pour la non-RV sont souvent
  306. très différentes, donc pour tout sauf les choses les plus simples, peut-être que 2 pages séparées
  307. sont meilleures ? Vous devrez décider.</p>
  308. <p>Note : pour diverses raisons, cela ne fonctionnera pas dans l'éditeur en direct
  309. sur ce site, donc si vous voulez le vérifier,
  310. <a href="../examples/webxr-basic-vr-optional.html" target="_blank">cliquez ici</a>.
  311. Il devrait démarrer en mode non-RV et vous pouvez utiliser la souris ou les doigts pour déplacer
  312. la caméra. Cliquer sur "Autoriser la RV" devrait basculer pour permettre le mode RV et vous devriez
  313. pouvoir cliquer sur "Entrer en RV" si vous êtes sur un dispositif RV.</p>
  314. <ul>
  315. <li><p>Décider du niveau de support RV</p>
  316. <p>Ci-dessus, nous avons couvert 3 types de dispositifs RV.</p>
  317. <ul>
  318. <li>3DOF sans entrée</li>
  319. <li>3DOF + entrée 3DOF</li>
  320. <li>6DOF + entrée 6DOF</li>
  321. </ul>
  322. <p>Vous devez décider combien d'efforts vous êtes prêt à investir
  323. pour supporter chaque type de dispositif.</p>
  324. <p>Par exemple, le dispositif le plus simple n'a pas d'entrée. Le mieux que vous puissiez
  325. généralement faire est de faire en sorte qu'il y ait des boutons ou des objets dans la vue de l'utilisateur
  326. et si l'utilisateur aligne un marqueur au centre de l'affichage
  327. sur ces objets pendant une demi-seconde environ, alors ce bouton est cliqué.
  328. Une UX courante consiste à afficher un petit minuteur qui apparaîtra au-dessus de l'objet indiquant
  329. que si vous maintenez le marqueur à cet endroit pendant un moment, l'objet/bouton sera sélectionné.</p>
  330. <p>Puisqu'il n'y a pas d'autre entrée, c'est à peu près le mieux que vous puissiez faire</p>
  331. <p>Au niveau supérieur, vous avez un dispositif d'entrée 3DOF. Généralement, il
  332. peut pointer vers des choses et l'utilisateur dispose d'au moins 2 boutons. Le Daydream
  333. possède également un pavé tactile qui fournit des entrées tactiles normales.</p>
  334. <p>Dans tous les cas, si un utilisateur dispose de ce type d'appareil, il est beaucoup plus
  335. confortable pour l'utilisateur de pouvoir pointer les choses avec
  336. son contrôleur que de devoir le faire avec sa tête en regardant les choses.</p>
  337. <p>Un niveau similaire pourrait être un appareil 3DOF ou 6DOF avec un
  338. contrôleur de console de jeu. Vous devrez décider quoi faire ici.
  339. Je soupçonne que la chose la plus courante est que l'utilisateur doit toujours regarder
  340. pour pointer et le contrôleur est juste utilisé pour les boutons.</p>
  341. <p>Le dernier niveau est un utilisateur avec un casque 6DOF et 2 contrôleurs 6DOF.
  342. Ces utilisateurs trouveront souvent une expérience qui n'est que 3DOF
  343. frustrante. De même, ils s'attendent généralement à pouvoir
  344. manipuler virtuellement des choses avec leurs mains en RV, donc vous devrez
  345. décider si vous voulez supporter cela ou non.</p>
  346. </li>
  347. </ul>
  348. <p>Comme vous pouvez le voir, commencer en RV est assez facile, mais réaliser quelque chose de livrable en RV
  349. nécessitera beaucoup de décisions et de conception.</p>
  350. <p>Ceci était une brève introduction à la RV avec three.js. Nous aborderons
  351. certaines méthodes d'entrée dans des <a href="webxr-look-to-select.html">articles futurs</a>.</p>
  352. </div>
  353. </div>
  354. </div>
  355. <script src="../resources/prettify.js"></script>
  356. <script src="../resources/lesson.js"></script>
  357. </body></html>
粤ICP备19079148号