Creating-a-scene.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <!DOCTYPE html>
  2. <html lang="pt-br">
  3. <head>
  4. <meta charset="utf-8">
  5. <base href="../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>Criando uma cena</h1>
  11. <p>O objetivo dessa seção é dar uma breve introdução ao three.js. Nós iremos começar configurando uma cena (scene) com um cubo giratório. Um exemplo é apresentado no final dessa página, caso você precise de ajuda.</p>
  12. <h2>Antes de começar</h2>
  13. <p>Antes de começar usar o three.js, você precisa de algum lugar para mostrá-lo. Salve o HTML abaixo em um arquivo no seu computador e abra o arquivo no navegador.</p>
  14. <code>
  15. &lt;!DOCTYPE html&gt;
  16. &lt;html&gt;
  17. &lt;head&gt;
  18. &lt;meta charset="utf-8"&gt;
  19. &lt;title&gt;My first three.js app&lt;/title&gt;
  20. &lt;style&gt;
  21. body { margin: 0; }
  22. &lt;/style&gt;
  23. &lt;/head&gt;
  24. &lt;body&gt;
  25. &lt;script type="module"&gt;
  26. import * as THREE from 'https://cdn.jsdelivr.net/npm/three/build/three.module.js';
  27. // Our Javascript will go here.
  28. &lt;/script&gt;
  29. &lt;/body&gt;
  30. &lt;/html&gt;
  31. </code>
  32. <p>Isso é tudo. Todo o código abaixo vai dentro da tag &lt;script&gt; vazia.</p>
  33. <h2>Criando a cena</h2>
  34. <p>Para realmente ser capaz de exibir algum conteúdo com o three.js, nós precisamos de três coisas: cena (scene), câmera (camera) e renderizador (renderer), para que possamos então renderizar a cena com a câmera.
  35. </p>
  36. <code>
  37. const scene = new THREE.Scene();
  38. const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
  39. const renderer = new THREE.WebGLRenderer();
  40. renderer.setSize( window.innerWidth, window.innerHeight );
  41. document.body.appendChild( renderer.domElement );
  42. </code>
  43. <p>Vamos tirar um momento para explicar o que está acontecendo aqui. Nós temos agora configurados a cena, nossa câmera e o renderizador.</p>
  44. <p>Existem alguns diferentes tipos de câmera no three.js. Por enquanto usaremos a `PerspectiveCamera`.</p>
  45. <p>O primeiro atributo é o `field of view`. FOV é a extensão da cena que é vista na tela em um dado momento. O valor está em graus.</p>
  46. <p>O segundo atributo é o `aspect ratio`. Você quase sempre irá usar o comprimento do elemento dividido pela sua altura, ou você terá o mesmo resultado de quando reproduz filmes antigos em uma TV widescreen - a imagem parece esmagada.</p>
  47. <p>Os próximos dois atributos são os planos de corte `near` e `far`. Isso significa que os objetos mais distantes da câmera do que o valor `far` ou mais próximos que o valor `near` não serão renderizados. Você não precisa se preocupar com isso agora, mas pode ser necessário usar outros valores em seus apps para obter uma melhor performance.</p>
  48. <p>Em seguida temos o renderizador. É aqui que a mágica acontece. Além da criação da instância do renderizador, nós também precisamos configurar o tamanho em que queremos renderizar nossa aplicação. É uma boa ideia usar o comprimento e a altura da área que queremos preencher com nossa aplicação - no nosso caso, o comprimento e altura da janela do navegador. Para aplicativos de alto desempenho, você pode fornecer valores menores para o `setSize`, como `window.innerWidth/2` e `window.innerHeight/2`, o que fará com que a aplicação seja renderizada no tamanho de um quarto do original.</p>
  49. <p>Se você deseja manter o tamanho do seu aplicativo mas renderizá-lo em uma resolução mais baixa, você pode chamar o `setSize` passando false como `updateStyle` (o terceiro argumento). Por exemplo, `setSize(window.innerWidth/2, window.innerHeight/2, false)` irá renderizar sua aplicação na metade da resolução, já que seu elemento &lt;canvas&gt; tem 100% de comprimento e altura.</p>
  50. <p>Por último mas não menos importante, nós adicionamos o elemento `renderer` ao nosso HTML. Este é o elemento &lt;canvas&gt; que o renderizador usa para exibir a cena para nós.</p>
  51. <p><em>"Tudo bem, mas onde está aquele cubo que você prometeu?"</em>. Vamos adicioná-lo agora.</p>
  52. <code>
  53. const geometry = new THREE.BoxGeometry( 1, 1, 1 );
  54. const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
  55. const cube = new THREE.Mesh( geometry, material );
  56. scene.add( cube );
  57. camera.position.z = 5;
  58. </code>
  59. <p>Para criar um cubo, nós precisamos de um `BoxGeometry`. Este é um objeto que contém todos os pontos (`vertices`) e preenchimento (`faces`) do cubo. Nós vamos explorar mais sobre isso no futuro.</p>
  60. <p>Além da geometria, nós precisamos de um material para colorir. Three.js vem com vários materiais, mas vamos nos ater ao `MeshBasicMaterial` por enquanto. Todos os materiais têm um objeto de propriedades que serão aplicadas a eles. Para manter as coisas simples, forneceremos apenas um atributo de cor `0x00ff00`, que é verde. Isso funciona da mesma maneira que as cores no CSS ou no Photoshop (`hex colors`).</p>
  61. <p>A terceira coisa que precisamos é de um `Mesh`. Um mesh é um objeto que pega a geometria e aplica um material a ela, para que então possamos inseri-lo em nossa cena e move-lo livremente.</p>
  62. <p>Por padrão, quando nós chamamos `scene.add()`, o elemento que queremos adicionar será inserido nas coordenadas `(0,0,0)`. Isso faz com que a câmera e o cubo fiquem um dentro do outro. Para evitar isso, simplesmente movemos a câmera um pouco para fora.</p>
  63. <h2>Renderizando a cena</h2>
  64. <p>Se você copiou o código acima para o arquivo HTML criado anteriormente, você não será capaz de ver nada. Isso acontece porque ainda não estamos renderizando nada. Para isso, precisamos chamar um `render ou animate loop`.</p>
  65. <code>
  66. function animate() {
  67. requestAnimationFrame( animate );
  68. renderer.render( scene, camera );
  69. }
  70. animate();
  71. </code>
  72. <p>Isso criará um loop que fará com que o renderizador desenhe a cena novamente toda vez que a tela for atualizada (em uma tela típica, isso significa 60 vezes por segundo). Se você é novato em escrever jogos no navegador, pode perguntar <em>"por que não criamos um setInterval?"</em>. A questão é - nós poderíamos, mas `requestAnimationFrame` tem várias vantagens. Talvez a mais importante seja que ele pausa quando o usuário navega para outra aba do navegador, portanto, não desperdiçando seu precioso poder de processamento e vida útil da bateria.</p>
  73. <h2>Animando o cubo</h2>
  74. <p>Se você inseriu todo o código acima no arquivo que criamos no início, deve visualizar uma caixa verde. Vamos deixar isso tudo um pouco mais interessante rotacionando o cubo.
  75. </p>
  76. <p>Adicione o seguinte trecho logo acima da chamada `renderer.render` na função `animate`:</p>
  77. <code>
  78. cube.rotation.x += 0.01;
  79. cube.rotation.y += 0.01;
  80. </code>
  81. <p>Isso será executado a cada quadro (normalmento 60 vezes por segundo), e dará ao cubo uma boa animação de rotação. Basicamente, quaquer coisa que você queira mover ou alterar enquanto a aplicação está sendo executada tem que passar pelo loop de animação. É claro que você pode chamar outras funções de lá para que não acabe com uma função `animate` com centenas de linhas.</p>
  82. <h2>O resultado</h2>
  83. <p>Parabéns! Agora você concluiu seu primeiro aplicativo three.js. É simples, mas você tem que começar de algum lugar.</p>
  84. <p>O código completo está disponível abaixo e como um [link:https://jsfiddle.net/0c1oqf38/ exemplo] editável. Brinque com ele para entender melhor como funciona.</p>
  85. <code>
  86. &lt;!DOCTYPE html&gt;
  87. &lt;html&gt;
  88. &lt;head&gt;
  89. &lt;meta charset="utf-8"&gt;
  90. &lt;title&gt;My first three.js app&lt;/title&gt;
  91. &lt;style&gt;
  92. body { margin: 0; }
  93. &lt;/style&gt;
  94. &lt;/head&gt;
  95. &lt;body&gt;
  96. &lt;script type="module"&gt;
  97. import * as THREE from 'https://cdn.jsdelivr.net/npm/three/build/three.module.js';
  98. const scene = new THREE.Scene();
  99. const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
  100. const renderer = new THREE.WebGLRenderer();
  101. renderer.setSize( window.innerWidth, window.innerHeight );
  102. document.body.appendChild( renderer.domElement );
  103. const geometry = new THREE.BoxGeometry( 1, 1, 1 );
  104. const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
  105. const cube = new THREE.Mesh( geometry, material );
  106. scene.add( cube );
  107. camera.position.z = 5;
  108. function animate() {
  109. requestAnimationFrame( animate );
  110. cube.rotation.x += 0.01;
  111. cube.rotation.y += 0.01;
  112. renderer.render( scene, camera );
  113. }
  114. animate();
  115. &lt;/script&gt;
  116. &lt;/body&gt;
  117. &lt;/html&gt;
  118. </code>
  119. </body>
  120. </html>