How-to-update-things.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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>Como atualizar as coisas</h1>
  11. <div>
  12. <p>Todos os objetos, por padrão, atualizam automaticamente suas matrizes se
  13. forem adicionados à cena (scene) dessa forma</p>
  14. <code>
  15. const object = new THREE.Object3D();
  16. scene.add( object );
  17. </code>
  18. ou se eles são filhos de outro objeto que foi adicionado à cena:
  19. <code>
  20. const object1 = new THREE.Object3D();
  21. const object2 = new THREE.Object3D();
  22. object1.add( object2 );
  23. scene.add( object1 ); //object1 and object2 will automatically update their matrices
  24. </code>
  25. </div>
  26. <p>
  27. No entanto, se você sabe que o objeto será estático, pode desativar este recurso e atualizar
  28. a matriz de transformação manualmente apenas quando necessário.
  29. </p>
  30. <code>
  31. object.matrixAutoUpdate = false;
  32. object.updateMatrix();
  33. </code>
  34. <h2>BufferGeometry</h2>
  35. <div>
  36. <p>
  37. BufferGeometries armazenam informações (tais como posições de vértice, índice de faces, normais, cores,
  38. UVs, e quaisquer outros atributos personalizados) em [page:BufferAttribute buffers] - isto é,
  39. [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays arrays tipados].
  40. Isso os torna geralmente mais rápidos do que os Geometries padrão, ao custo de serem um pouco mais difíceis de
  41. trabalhar.
  42. </p>
  43. <p>
  44. Com relação à atualização dos BufferGeometries, o mais importante é entender que
  45. você não pode redimensionar buffers (isso é muito custoso, sendo basicamente o equivalente a criar uma nova geometria).
  46. No entanto, você pode atualizar o conteúdo dos buffers.
  47. </p>
  48. <p>
  49. Isso significa que se você sabe que um atributo do seu BufferGeometry vai crescer, digamos o número de vértices,
  50. você deve pré-alocar um buffer grande o suficiente para conter quaisquer novos vértices que possam ser criados.
  51. É claro, isso também significa que haverá um tamanho máximo para o seu BufferGeometry -
  52. não há como criar um BufferGeometry que possa ser estendido de forma eficiente indefinidamente.
  53. </p>
  54. <p>
  55. Usaremos o exemplo de uma linha que é estendida em tempo de renderização. Vamos alocar espaço
  56. no buffer para 500 vértices, mas desenhando apenas dois primeiro, usando [page:BufferGeometry.drawRange].
  57. </p>
  58. <code>
  59. const MAX_POINTS = 500;
  60. // geometry
  61. const geometry = new THREE.BufferGeometry();
  62. // attributes
  63. const positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
  64. geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
  65. // draw range
  66. const drawCount = 2; // draw the first 2 points, only
  67. geometry.setDrawRange( 0, drawCount );
  68. // material
  69. const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );
  70. // line
  71. const line = new THREE.Line( geometry, material );
  72. scene.add( line );
  73. </code>
  74. <p>
  75. Em seguida, adicionaremos aleatoriamente pontos à linha usando um padrão como:
  76. </p>
  77. <code>
  78. const positionAttribute = line.geometry.getAttribute( 'position' );
  79. let x = 0, y = 0, z = 0;
  80. for ( let i = 0; i < positionAttribute.count; i ++ ) {
  81. positionAttribute.setXYZ( i, x, y, z );
  82. x += ( Math.random() - 0.5 ) * 30;
  83. y += ( Math.random() - 0.5 ) * 30;
  84. z += ( Math.random() - 0.5 ) * 30;
  85. }
  86. </code>
  87. <p>
  88. Se você quiser alterar o <em>número de pontos</em> renderizados após a primeira renderização, faça o seguinte:
  89. </p>
  90. <code>
  91. line.geometry.setDrawRange( 0, newValue );
  92. </code>
  93. <p>
  94. Se você deseja alterar os valores dos dados de posição após a primeira renderização, você precisa
  95. definir a propriedade needsUpdate assim:
  96. </p>
  97. <code>
  98. positionAttribute.needsUpdate = true; // required after the first render
  99. </code>
  100. <p>
  101. Se você alterar os valores dos dados de posição após a renderização inicial, pode ser necessário recalcular
  102. os limites de volume para que outros recursos da engine, como view frustum culling ou helpers,
  103. funcionem corretamente
  104. </p>
  105. <code>
  106. line.geometry.computeBoundingBox();
  107. line.geometry.computeBoundingSphere();
  108. </code>
  109. <p>
  110. [link:https://jsfiddle.net/t4m85pLr/1/ O fiddle] mostra uma linha animada que você pode adaptar ao seu caso de uso.
  111. </p>
  112. <h3>Exemplos</h3>
  113. <p>
  114. [example:webgl_custom_attributes WebGL / custom / attributes]<br />
  115. [example:webgl_buffergeometry_custom_attributes_particles WebGL / buffergeometry / custom / attributes / particles]
  116. </p>
  117. </div>
  118. <h2>Materiais (Materials)</h2>
  119. <div>
  120. <p>
  121. Todos os valores uniformes podem ser alterados livremente (por exemplo, cores, texturas, opacidade, etc),
  122. os valores são enviados para o shader a cada quadro.
  123. </p>
  124. <p>
  125. Também os parâmetros relacionados ao GLstate podem mudar a qualquer momento
  126. (depthTest, blending, polygonOffset, etc).
  127. </p>
  128. <p>
  129. As seguintes propriedades não podem ser alteradas facilmente em tempo de execução
  130. (uma vez que o material é renderizado pelo menos uma vez):
  131. </p>
  132. <ul>
  133. <li>números e tipos de uniformes</li>
  134. <li>presença ou não de
  135. <ul>
  136. <li>textura (texture)</li>
  137. <li>fog</li>
  138. <li>cores dos vértices (vertex colors)</li>
  139. <li>morphing</li>
  140. <li>shadow map</li>
  141. <li>alpha test</li>
  142. <li>transparent</li>
  143. </ul>
  144. </li>
  145. </ul>
  146. <p>
  147. Mudanças nestas propriedades requerem a construção de um novo programa de shader. Você precisará definir</p>
  148. <code>material.needsUpdate = true</code>
  149. <p>
  150. Tenha em mente que isso pode ser bastante lento e induzir lags na taxa de quadros (especialmente no Windows, pois a compilação do shader é mais lenta no DirectX do que no OpenGL).
  151. </p>
  152. <p>
  153. Para uma experiência mais suave, você pode emular alterações nessas propriedades
  154. até certo ponto, por ter valores "fictícios" como luzes de intensidade zero, texturas brancas ou fog de densidade zero.
  155. </p>
  156. <p>
  157. Você pode alterar livremente o material usado para partes da geometria,
  158. no entanto, você não pode alterar como um objeto é dividido em partes (de acordo com os materiais da face).
  159. </p>
  160. <h3>Se você precisar ter diferentes configurações de materiais durante o tempo de execução:</h3>
  161. <p>
  162. Se o número de materiais / partes for pequeno, você pode pré-dividir o objeto
  163. de antemão (por exemplo, cabelo / rosto / corpo / roupa superior / calças para um humano,
  164. frente / laterais /topo / vidro / pneu / interior para um carro).
  165. </p>
  166. <p>
  167. Se o número for grande (por exemplo, cada rosto pode ser potencialmente diferente),
  168. considere uma solução diferente, como usar atributos / texturas para produzir diferenças
  169. nos rostos.
  170. </p>
  171. <h3>Exemplos</h3>
  172. <p>
  173. [example:webgl_materials_car WebGL / materials / car]<br />
  174. [example:webgl_postprocessing_dof WebGL / webgl_postprocessing / dof]
  175. </p>
  176. </div>
  177. <h2>Texturas</h2>
  178. <div>
  179. <p>
  180. Imagem, canvas, vídeo e dados de textura precisam ter a seguinte
  181. propriedade definida se eles forem alterados:
  182. </p>
  183. <code>
  184. texture.needsUpdate = true;
  185. </code>
  186. <p>Os alvos de renderização são atualizados automaticamente.</p>
  187. <h3>Exemplos</h3>
  188. <p>
  189. [example:webgl_materials_video WebGL / materials / video]<br />
  190. [example:webgl_rtt WebGL / rtt]
  191. </p>
  192. </div>
  193. <h2>Câmeras</h2>
  194. <div>
  195. <p>
  196. A posição e o alvo de uma câmera são atualizados automaticamente. Se você precisa mudar
  197. </p>
  198. <ul>
  199. <li>
  200. fov
  201. </li>
  202. <li>
  203. aspect
  204. </li>
  205. <li>
  206. near
  207. </li>
  208. <li>
  209. far
  210. </li>
  211. </ul>
  212. <p>
  213. então você precisará recalcular a matriz de projeção:
  214. </p>
  215. <code>
  216. camera.aspect = window.innerWidth / window.innerHeight;
  217. camera.updateProjectionMatrix();
  218. </code>
  219. </div>
  220. </body>
  221. </html>