01
Primeira Cena
Criando sua primeira cena com 'Three.js'
Os navegadores modernos da internet estão ficando cada vez mais poderosos,com recursos muito avançados que podem ser acessados diretamente pelo JavaScript,sem a instalação de nenhum programa. Agora,áudio e vídeo podem ser adicionados diretamente num documento HTML graças aos novos elementos do HTML5,criando componentes mais interativos. O WebGL presta apoio,como uma nova adição,à este conjunto de características. O WebGL pode fazer uso direto dos recursos de processamento da placa gráfica e criar computação gráfica 2D e 3D de alta performance. A programação WebGL pode ser executada diretamente com o JavaScript para criação e animação da cena,mas esta programação é complexa e sujeita a muitos erros durante o seu desenvolvimento. 'Three.js' é uma biblioteca que torna muito mais fácil o desenvolvimento de cenas 3D,com a criação de geometrias 3D simples e complexas,animação de objetos que se movem através de uma cena 3D,aplicação de texturas e materiais para seus objetos,carregamento de objetos criados com softwares de modelagem 3D e criação de gráficos 2D baseados em partículas.
O esqueleto básico contém os elementos html,head e body e um elemento div com atributo id,dentro do corpo do documento,para ser utilizado na renderização e apresentação da cena 3D. No elemento head é declarado o título da página e carregado o arquivo JavaScript externo contendo a biblioteca 'Three.js',usada para gerar o processamento 3D. No elemento body da página está o elemento div onde a cena será renderizada e um elemento script com a função para conter os comandos para criação da cena 3D. A função será executada a partir da sua atribuição ao evento window.onload,disparado após a página ser totalmente carregada pelo navegador.
A primeira cena apresenta uma câmera focando as malhas de um plano,um cubo e uma esfera - sem material e mostrando a armação de arame (wireframe) da geometria,mais o conjunto de ponteiros dos eixos X,Y e Z. O elemento body da página tem o elemento script com a função contendo a programação de comandos 'Three.js' utilizados na criação dos objetos da cena. A saída do renderizador do 'Three.js' é direcionada para o elemento div,presente no elemento body e localizado com o atributo id.
Cena básica com uma câmera,um plano,um cubo,uma esfera e um holofote,que é uma fonte de luz da classe SpotLight. Neste exemplo,a luz não causa efeito sobre os materiais das malhas do plano,do cubo e da esfera pois os materiais das malhas são da classe MeshBasicMaterial. Apesar de não afetar o material das malhas,por exemplo causando reflexo,a luz do holofote projeta a sombra das malhas umas sobre as outras,do cubo e da esfera sobre o plano.
Demonstração da cena animada com uma câmera,um plano,um cubo girando parada sobre o plano e umaa esfera quicando de um lado para o outro. É introduzido o método requestAnimationFrame(),utilizado para o processamento repetido da cena em um determinado intervalo de tempo.
Demonstração da interface de controle de objetos com a biblioteca 'dat.GUI',criada por engenheiros do Google. Esta biblioteca permite a criação de um componente simples para servir de interface do usuário com os objetos da cena,permitindo o usuário a alterar as propriedades dos objetos presentes na cena. Neste exemplo,o controle 'dat.GUI' disponibiliza uma interface de usuário para controlar a velocidade da bola quicando e a velocidade de rotação do cubo. Este controle está disponível no endereço https://github.com/dataarts/dat.gui.
Exemplo demonstrando o ajuste da escala da cena de acordo com o tamanho da tela,ao ser redimensionada. A mudança da escala da cena é relativa à mudança do tamanho da tela.
02
Componentes Básicos
Trabalhando com os componentes básicos que compõem a cena com 'Three.js'.
No capítulo anterior foram apresentados alguns conceitos básicos para criação de cenas 3D com a biblioteca 'Three.js'. Um conjunto de exemplos demonstraram as primeiras cenas completas criadas com o 'Three.js'. Neste capítulo,a biblioteca 'Three.js' é explicada mais detalhadamente,explicando os componentes básicos que compõem uma cena 'Three.js': os componentes são usados em uma cena 'Three.js',o que fazer com o objeto da classe Scene,como geometrias,materiais e malhas estão relacionados e a diferença entre a câmera ortográfica a câmera perspectiva.
Cena básica com uma câmera,um plano,um holofote e a interface de controle. Esta interface permite a adição de cubos e a alteração da sua velocidade de rotação.
Neste exemplo,a cena é similar à do exemplo anterior,mas a propriedade fog do objeto da classe Scene é alterada para permitir o efeito de névoa na cena completa,onde mais distante da câmera a malha estiver,mais escondida da vista ficará.
Neste exemplo,a propriedade overrideMaterial é utilizada para fixar o material das malhas da cena no momento de sua criação,fazendo com que todas as malhas adicionadas na cena utilizem o mesmo material,quando não for especificada na criação da malha.
02.04
Ver
A biblioteca 'Three.js' vem com um grande conjunto de geometrias para serem usadas junto com os materiais nas malhas adicionadas à cena. Neste exemplo alguns deles serão demonstrados.
A geometria personalizada utiliza um conjunto de vértices e faces para serem usados na malha. Neste exemplo é criado um cubo,cujos vértices podem ter sua posição x,y e z alteradas com a interface de controle,permitindo a visualização da mudança na formação da malha,em função da nova posição do vértice modificado.
Neste exemplo a cena contém uma câmera,um holofote,um plano e um cubo. A interface de controle permite a alteração das propriedades da malha do cubo: escala,posição,rotação e translado. As malhas são adicionadas na cena e propriedades do cubo podem ser alteradas.
Existem dois diferentes tipos de câmeras disponíveis na biblioteca 'Three.js'. A câmera perspectiva,com vista em perspectiva,é mais natural,comparativamente como as pessoas veem as coisas na natureza,calculando os objetos em função da distância. A câmera ortográfica,na qual todos os objetos são processados com o mesmo tamanho,e a distância entre um objeto e a câmera não importa,é frequentemente utilizada em jogos 2D.
Neste exemplo é mostrada a criação da câmera apontada para o centro da cena usando as coordenadas de posição (0,0,0).
03
Fontes de Luz
Trabalhando com as diferentes fontes de luz disponíveis no 'Three.js'
No primeiro capítulo foram apresentados os conceitos básicos da biblioteca 'Three.js',e no segundo capítulo foram aprofundados alguns conceitos importantes da cena: as geometrias,os materiais,as malhas e as câmeras. As luzes não foram explicadas nesses capítulos,embora sejam parte importante da cena com 'Three.js'. Sem luzes,quase nada processado poderá ser visto. A biblioteca 'Three.js' contém um grande número de tipos de luz,cada tipo com um uso específico. Este capítulo inteiro explica os detalhes de luzes e introduz o próximo capítulo para o uso de materiais. Saiba quais as fontes de luz estão disponíveis na biblioteca 'Three.js',quando usar uma fonte de luz específica,como sintonizar e configurar o comportamento das fontes de luz e como causar o efeito de reflexo na lente da câmera.
A fonte de luz da classe AmbientLight aplica a sua cor globalmente,sem uma direção específica. A fonte de luz ambiente não contribuie com sombras,e não deve ser usada como a única fonte de luz em uma cena,e sim em conjunto com outras fontes de luz,como das classes Spotlight e DirectionalLight,para suavização de sombras ou para adicão de mais de cor na cena.
A classe PointLight da biblioteca 'Three.js' é uma fonte de luz que brilha em todas as direções,emanando de um único ponto. Um bom exemplo de um ponto de luz é o feixe vindo do céu de noite.
A luz de holofote é muito utilizada para projetar sombra sobre os objetos da cena. Tem um efeito de cone que pode ser comparado com a luz de uma lanterna,considerando a direção e o ângulo da fonte na produção de luz. As propriedades da classe PointLight também se aplicam a na classe SpotLight,que tem as propriedades adicionais castShadow,shadowCameraNear,shadowCameraFar,shadowCameraFov,shadowBias,angle,exponent,onlyShadow,shadowCameraVisible,shadowMapWidth e shadowMapHeight.
A fonte da classe DirectionalLight emite luz muito distante,cujos raios são enviados em paralelo,uns aos outros. Um bom exemplo é o sol,tão distante que na Terra seus raios de luz são recebidos paralelos uns com os outros. A principal diferença entre uma fonte DirectionalLight e dos holofotes que vimos anteriormente é que esta luz não diminuirá à medida que a distância até o alvo fique maior. A área completa iluminada pela fonte DirectionalLight recebe o mesma intensidade de luz.
A fonte de luz da classe HemisphereLight permite a criação de uma iluminação ao ar livre com aparência mais natural,simulando o ar livre. Sendo criadas uma fonte DirectionalLight emulando o sol e talvez uma fonte AmbientLight,para fornecer um pouco de cor em geral para a cena,senão a cena não ficará realmente natural. Quando se está ao ar livre,nem toda a luz vem diretamente de cima. A luz é bastante difundida pela atmosfera,que se reflete pelo solo e também é refletida por outros objetos. A fonte HemisphereLight da biblioteca 'Three.js' é própria para cenas ao ar livre,proporcionando uma iluminação mais natural.
A fonte de luz da classe AreaLight é emitida a partir de uma área retangular. O código da classe AreaLight não está incluído na biblioteca 'Three.js' padrão,mas sim em uma de suas extensões,exigindo algumas declarações aicionais no documento HTML para sua utilização.
Este exemplo mostra o reflexo da luz na lente da câmera,um efeito da fotografia bastante familiar para qualquer pessoa. Por exemplo,eles ocorrem quando a fotografia é tomada diretamente contra o sol. Na maioria dos casos é um efeito que deve ser evitado,mas em jogos e imagens 3D geradas por computador podem proporcionar um resultado agradável,para tornar as cenas um pouco mais realistas.
04
Materiais
Trabalhando com os materiais com 'Three.js'
Os materiais já foram introduzidos nos capítulos anteriores,formando,em conjunto com as geometrias,as malhas adicionadas na cena. O material é como a pele da geometria,definindo como o objeto ficará pelo lado de fora. Por exemplo,se a pele da geometria terá aspecto metálico,transparente,ou como uma armação de arame (wireframe).
O material da classe MeshBasicMaterial é simples e não leva iluminação em conta no processamento da cena,sendo utilizado na criação de superfícies sem brilho e com aparência fosca. Malhas com este material são processadas como polígonos planos simples,com propriedade para habilitar a apresentação da 'armação de arame' (wireframe) da geometria.
O material da classe MeshDepthMaterial não é definido por luzes ou propriedades específicas do material,mas pela distância da malha do objeto à câmera. Este material pode ser combinado com outros materiais para facilitar a criação do efeito de desvanecimento. Tem duas propriedades que controlam o wireframe: wireframe,que define se o wireframe será mostrado e wireframeLinewidth,que define a largura do wireframe.
No exemplo apresentado anteriormente não foram definidas cores aos cubos criados com o material MeshDepthMaterial. A biblioteca 'Three.js',no entanto,tem a opção de combinar os materiais em conjunto para criar novos efeitos.
Com o material normal de face,cada face da malha é processada com uma cor ligeiramente diferente,e mesmo com o objeto tridimensional girando,as cores permanecem praticamente estáticas. Isto acontece porque a cor de cada face é baseada na normal apontando para fora face. Esta normal é o vetor perpendicular à face. O vetor normal é usado em muitas partes diferentes da biblioteca 'Three.js'. Ele é utilizado para determinar a reflexão de luz no mapeamento de texturas para modelos 3D,nas informações sobre a luz,a sombra e a cor dos pixels em uma superfície. A biblioteca 'Three.js' lida com a computação desses vetores para usá-los internamente.
O material da face é composto por outros materiais,funcionando como um recipiente,agrupando estes materiais. O objeto da classe MeshFaceMaterial permite a atribuição de um material diferente para cada face da geometria. Por exemplo,um cubo utiliza o material de face composto por outros seis diferentes materiais,uma para cada face do cubo,usando diferentes texturas de cor ou imagem.
Este material é usado para criação de superfícies sem brilho,com aparência fosca. Este é um dos muito materiais de fácil utilização,que responde a uma das fontes de iluminação disponíveis no cena. Ele pode ser configurado com um número de propriedades que já vimos antes,mas o foco sobre os que são específicos para este material: ambient e emissive.
Com um MeshPhongMaterial é possível criar um material brilhante. As propriedades que você pode usar para isso são praticamente o mesmo que para um não-brilhante MeshLambertMaterial.
O ShaderMaterial é um dos materiais mais versáteis e complexos disponíveis na biblioteca 'Three.js'. Com ele,você pode passar em seus próprios shaders personalizados que serão diretamente executados no contexto WebGL. Um shader é o que converte os objetos JavaScript do 'Three.js' em pixels na tela. Com estes shaders personalizados,você pode definir exatamente como seu objeto deve ser processado e substituído,ou alterar os padrões da biblioteca 'Three.js'. Shaders personalizados são detalhados no Capítulo 11.
Os materiais disponíveis para a geometria Line são muito simples. As propriedades disponíveis para este material são color,linewidth,LineCap,LineJoin,vertexColors e fog.
Este material tem as mesmas propriedades da classe LineBasicMaterial,e duas adicionais,para definir a largura do traço e a largura dos espaços entre os traços,são elas dashSize e gapSize.
05
Geometrias
Aprendendo a trabalhar com geometrias
Nos capítulos anteriores já foram apresentados os conceitos básicos sobre como utilizar o 'Three.js' para criar uma cena com iluminação,malhas de geometrias e materiais. No capítulo 2 foram apresentadas algumas das geometrias que o 'Three.js' disponibiliza para criação de objetos 3D,mas sem realmente entrar em maiores detalhes. Neste e no próximo capítulo,serão apresentadas geometrias básicas que 'Three.js' fornece,e outras a partir de ferramentas externas,incorporadas na cena com a inclusão de um JavaScript no documento HTML. As geometrias básicas são: PlaneGeometry,CircleGeometry,ShapeGeometry,CubeGeometry,SphereGeometry,CylinderGeometry,TorusGeometry,TorusKnotGeometry,PolyhedronGeometry,IcosahedronGeometry,OctahedronGeometry e TetraHedronGeometry.
05.01
Ver
O objeto da classe PlaneGeometry cria uma geometria bidimensional de retângulo,bastante simples,com altura e largura mas,por ser 2D,sem profundidade.
05.02
Ver
O objeto da classe CircleGeometry cria a geometria de um círculo 2D muito simples,ou um círculo 2D parcial. Neste exemplo é criado um círculo com a propriedade thetaLength menor do que 2 * π,com controle GUI das propriedades radius,segments,thetaStart e thetaLength.
O objeto da classe ShapeGeometry é utilizado para criação de formas 2D personalizadas. As geometrias PlaneGeometry e CircleGeometry têm formas limitadas para personalização da sua aparência. Com o objeto ShapeGeometry você tem um conjunto de propriedades e métodos personalização das formas. Esta geometria pode ser comparada com a funcionalidade dos elementos HTML canvas e svg.
05.04
Ver
O objeto da classe RingGeometry cria a geometria 2D de um anel.
05.05
Ver
A apresentação de geometrias tridimensionais básicas se inicia com o objeto da classe CubeGeometry. É uma geometria 3D muito simples que permite que você crie um cubo especificando a sua largura,altura e profundidade. Foi substituida em versões mais atualizadas da biblioteca 'Three.js' pela classe BoxGeometry. Embora as medidas não possam ser alteradas após a geometria da malha ter sido criada,disponibiliza as propriedades width,height e depth.
05.06
Ver
O objeto da classe SphereGeometry cria a geometria 3D de uma esfera.
05.07
Ver
O objeto da classe CilynderGeometry cria a geometria 3D de um cilindro.
05.08
Ver
Um toro é uma forma simples que se parece com um donut. Como a maioria das geometrias simples,não existem argumentos obrigatórios quando o objeto TorusGeometry é criado. Suas propriedades são radius,tube,radialSegments,tubularSegments e arc.
05.09
Ver
Torus Knot.
05.10
Ver
O objeto da classe PolyhedronGeometry permite a criação de poliedros,que são geometria apenas com faces planas e bordas retas. Na maioria das vezes,porém,não é usada diretamente. A biblioteca 'Three.js' fornece um número de poliedros específicos que podem ser utilizados sem a necessidade de especificação direta dos vértices e faces do objeto PolyhedronGeometry.
06
Geometrias Avançadas e Operações Binárias
Usando geometrias avançadas e operações binárias.
No capítulo anterior foram apresentadas as geometrias básicas disponíveis no 'Three.js',que também oferece um conjunto avançado de geometrias especializadas. Neste capítulo serão apresentadas estas geometrias avançadas,abrangendo como usar as geometrias avançados como das classes ConvexGeometry,LatheGeometry e TubeGeometry,como criar formas 3D a partir de formas 2D usando a classe ExtrudeGeometry,como criar formas personalizadas com a classe ParametricGeometry,calculando a geometria a partir de um conjunto de equações,como criar textos 3D usando objetos da classe TextGeometry e como criar novas geometrias a partir das já existentes com as operações binárias fornecidas pelos 'Three.js',utilizando a extensão THREEBSP.
O objeto da classe ConvexGeometry cria um casco convexo em torno de um conjunto de pontos. Um casco convexo é a forma mínima que engloba todos estes pontos. Neste exemplo é apresentado o casco convexo de um conjunto aleatório de pontos. Com um clique,é redesenhado com 20 novos pontos. Nós são adicionados em cada um dos pontos uma pequena esfera da classe 'SphereGeometry' para tornar mais claro como um casco convexo funciona.
O objeto da classe LatheGeometry lhe permite criar formas a partir de uma curva suave. Esta curva é definida por um número de pontos (também chamado nós) e é frequentemente denominada spline. Este spline é girado em torno de um ponto fixo e resultados em formas do tipo vaso e sino.
A biblioteca 'Three.js' fornece um conjunto de diferentes maneiras uma forma 2D pode ser empurrada gerando uma forma 3D. Com extrusão queremos dizer que esticamos uma forma 2D ao longo de seu eixo Z para convertê-lo em 3D. Por exemplo,se nós removermos o objeto CircleGeometry,obtemos uma forma que se parece com um cilindro,e se remover um objeto PlaneGeometry,teremos um cubo. Com o ExtrudeGeometry uma geometria 3D pode ser criada a partir de outra 2D.
Um objeto da classe TubeGeometry cria um tubo que faz a extrusão ao longo de uma ranhura 3D. Você especifica o caminho usando um número de vértices e o tubo será criado.
Ao ser apresentado o objeto ShapeGeometry anteriormente,foi mencionado que os elementos SVG e Canvas seguem praticamente a mesma abordagem para desenhar formas. O elemento SVG,especialmente,é constituído de um jeito muito similar à das geometrias do 'Three.js'. Neste exemplo é mostrado como a pequena biblioteca d3-threeD é utilizada para converter caminhos SVG para uma forma 'Three.js'.
O objeto da classe ParametricGeometry permite a criação de uma geometria personalizada com o uso de equações parametrizadas.
Na última parte desse capítulo será tratada a criação de efeitos de texto 3D. Primeiro,será analisada a forma de criação do texto usando-se as fontes fornecidas pelo 'Three.js'. Depois será analisado o uso de fontes suas. A renderização de texto em 'Three.js' é muito fácil. Tudo o que é necessário é definir-se o tipo de letra e as propriedades básicas de extrusão da classe ExtrudeGeometry.
A geometrias padrões do 'Three.js' criam geometrias interessantes,que no entanto estão limitadas ao conjunto de classes de objetos disponíveis na biblioteca. As geometrias podem ser combinadas várias destas geometrias padrão para criar outras. Para isso é utilizada a extensão 'THREEBSP' do 'Three.js',que você pode encontrar online em https://github.com/skalnik/ThreeBSP. Esta extensão de biblioteca disponibiliza as funções intersect,union e subtract.
07
Partículas e o Sistema de Partículas
Partículas e o Sistema de Partículas
No capítulo 7 serão apresentadas as partículas,utilizadas na simulação de objetos pequenos como chuva e neve e para criação de efeitos 3D interessantes como o processamento de geometrias individuais definidas como partículas,com controle separado dessas partículas. Os exemplos desse capítulo apresentam a criação com estilos de partículas com a classe ParticleBasicMaterial,como usar um sistema de partículas para criar um conjunto agrupado de partículas,como criar um sistema de partículas de geometrias existentes,como animar partículas e o sistema de partículas,como adicionar uma textura ao conjunto de estilos das partículas e como usar o estilo de uma partícula com objetos da classe ParticleCanvasMaterial.
A biblioteca 'Three.js' oferece duas diferentes maneiras de usar o elemento canvas. A classe CanvasRenderer faz referência direta ao canvas através do objeto ParticleCanvasMaterial. Com objetos da classe ParticleCanvasMaterial a saída para o elemento canvas pode ser utilizada como textura para suas partículas. Este material é criado especificamente para o CanvasRenderer e só funciona quando você usar este processador específico. Antes de olharmos em como usar esse material,vamos primeiro olhar para os atributos que você pode definir neste material: color,program,opacity,transparent e blending.
A classe WebGLRenderer permite outros recursos adicionais para usar o elemento canvas. Deve ser feita uma abordagem um pouco diferente. A classe ParticleCanvasMaterial não vai funcionar,então usamos a classe ParticleBasicMaterial para esta finalidade. Nos atributos para o ParticleBasicMaterial temos a propriedade map. Com ela,nós podemos carregar uma textura para a partícula.
Esse demo apresenta uma nuvem básica de pontos criada com o objeto da classe PointCloud,usando a geometria do objeto da classe Geometry agrupando as partículas de objetos da classe Vector3,e o material da classe PointCloudMaterial.
Este exemplo apresenta uma nuvem de particulas baseadas em programação,com o sprite do Pac-Man gerado por programação. As partículas da classe Sprite usam material da classe SpriteCanvasMaterial,que contém a propriedade program com a função de criação do sprite usado na partícula. As partículas da nuvem de sprites do Pac-Man são criadas e inseridas diretamente na cena.
Este exemplo apresenta uma nuvem básica de pontos com o objeto da classe PointCloud,usando a geometria do objeto da classe Geometry agrupando as partículas de objetos da classe Vector3,e o material da classe PointCloudMaterial,com a propriedade map apontando para a função responsável pela criação do sprite do Pac-Man.
Este exemplo apresenta uma nuvem de particulas baseadas em programação,com o sprite do Pac-Man gerado por programação. As partículas da classe Sprite usam material da classe SpriteCanvasMaterial,que contém a propriedade program com a função de criação do sprite usado na partícula. As partículas da nuvem de sprites do Pac-Man são criadas e inseridas diretamente na cena.
No exemplo anterior foi demonstrado como criar um estilo para um sistema de partículas utilizando o elemento canvas. Desde que qualquer coisa pode ser desenhada,mesmo com o carregamento de imagens externas,com essa abordagem podem ser adicionados diversos tipos de estilos para o sistema de partículas. Há,no entanto,uma maneira mais direta para usar uma imagem no estilo de suas partículas. A biblioteca 'Three.js' permite o carregamento de imagens externas com a função THREE.ImageUtils.loadTexture().
Neste exemplo não vai chover,vai nevar. Não será usada apenas uma textura,mas cinco imagens separadas,a partir dos exemplos do 'Three.js'. Com o obeto ParticleSystem podemos ter apenas um material,portanto para utilizar múltiplos materiais é necessário serem criados vários sistemas de partículas.
07.09
Ver
O objeto da classe THREE.Sprite é utilizado com dois diferentes objetivos. Primeiro,criar um objeto que é movido,posicionado e dimensionado com base na tela. Você pode usar isso para criar um Heads-Up Display (HUD) como uma camada para o seu conteúdo 3D. O exemplo utiliza partículas da classe THREE.Sprite simples,se movendo da esquerda para a direita sobre a tela. Será processada uma cena 3D com uma câmera em movimento para ilustrar o movimento independente do sprite na cena.
07.10
Ver
Neste exemplo,a partícula é criada como um objeto que pode ser movido no espaço 3D assim como o objeto Particle permite ao objeto CanvasRenderer. Usando sprites num ambiente 3D também é chamado às vezes 'billboarding'. Isto implica no giro constante do sprite apontando para a câmera,assim como os avisos ao longo de uma rodovia estão virados para o motorista.
Criar um sistema de partículas a partir de um modelo.
08
Criação e Carregamento Avançado de Objetos
Criação e carregamento avançado de objetos das classes disponíveis na biblioteca 'Three.js'
O capítulo 8 mostra diferentes modos avançados de geometrias e malhas complexas. O Capítulo 5 mostrou como criar algumas geometrias avançados usando objetos nativos do 'Three.js'. Neste capítulo são utilizadas duas abordagens para criação de geometrias e malhas avançadas,que são: agrupamento e fusão,que é a a primeira abordagem e explica as funcionalidades nativas do 'Three.js' para agrupar e mesclar as geometrias existentes,criando novas malhas e geometrias a partir de objetos existentes e o carregamento de malhas e geometrias de outras fontes exteriores como software de modelagem 3D. Por exemplo o Blender,que permite a exportação de malhas em formatos que o 'Three.js' suporta. Começamos com a abordagem de agrupamento e mesclagem: usamos a função GeometryUtils.merge() para mesclar objetos.
Em alguns dos capítulos anteriores,você já viu isso quando se trabalha com vários materiais. Quando você cria uma malha a partir de uma geometria usando múltiplos materiais,o 'Three.js' cria um grupo. Para este grupo,várias cópias de sua geometria são adicionadas,cada uma com seu próprio material específico. Este grupo é devolvido,de modo que parece como uma malha que usa vários materiais. Na verdade,no entanto,é um grupo que contém um número de malhas. A criação de grupos é muito fácil. Cada malha você cria pode conter elementos filhos,que pode ser adicionados usando a função add. O efeito da adição de um objeto subordinado a um grupo é que você pode mover,redimensionar,girar e traduzir o objeto pai,e toda objeto filho também será afetado.
Na maioria dos casos o uso de grupos permite manipular e gerenciar facilmente um grande número de malhas. Quando você está lidando com um grande número de objetos,no entanto,o desempenho vai se tornar um problema. Com grupos você ainda está trabalhando com objetos individuais em que cada um precisa ser tratado separadamente. Com o THREE.GeometryUtils.merge() você pode mesclar objetos e criar um objeto combinado. No exemplo a seguir,você pode ver como isso funciona e o efeito que tem sobre o desempenho.
A biblioteca 'Three.js' tem seu próprio formato JSON que você pode usar para definir uma geometria ou uma cena. É muito fácil de usar é muito útil quando você deseja reutilizar geometrias complexas ou cenas. Você pode usar o formato JSON 'Three.js' para dois cenários diferentes. Você pode usá-lo para salvar e carregar uma única geometria,ou você pode usá-lo para salvar e carregar um cena completa.
Carregar e salvar a cena com JSON.
Carregar Blender com JSON.
Carregar arquivo com formato OBJ.
OBJ é um formato 3D simples primeiro desenvolvido pela Wavefront. É um dos o arquivo 3D mais comuns e é usado para definir a geometria de um objeto. MTL é um formato complementar para o OBJ. É num arquivo MTL que o material dos objetos de um arquivo OBJ é especificado.
Collada é um formato baseado em XML. Este também é um formato amplamente utilizado que é suportado por muitas aplicações 3D e mecanismos de renderização.
STL significa STereoLithography e é amplamente utilizado para uma rápida prototipagem. Por exemplo,os modelos de impressoras 3D são frequentemente definidos como um arquivo STL.
Carregar arquivo com formato CTM.
Carregar arquivo com formato VTK.
Carregar arquivo com formato PDB.
Carregar arquivo com formato PLY.
Carregar arquivo com formato AWD.
Carregar arquivo com formato Assimp.
Carregar arquivo com formato VRML.
Carregar arquivo com formato Babylon.
09
Animações e Movimento da Câmera
Animações e Movimento da Câmera
Nos capítulos anteriores foram apresentadas algumas animações simples,pouco complexas. No primeiro capítulo,foi introduzido o ciclo básico de processamento,e no capítulo seguinte foram apresentados alguns objetos simples e alguns conceitos básicos de animação. Neste capítulo é apresentada a animação de cena com o 'Three.js',com os seguintes temas: animação básica com a repetição da renderização em intervalo específico e alteração nas três propriedades de um objeto: a sua posição,a sua rotação,e sua escala,movimentação da câmera ao redor da cena através de vários controles suportados pelo 'Three.js',morphing e esfolação,na visualização de animações de formas de malhas mais complexas,usando morfos para definir a transição entre uma geometria e outra,e uso de 'ossos e esfolas' nestas transições,e carregamento de animações externas,com a animação de objetos carregados a partir de arquivos externos,usando formatos suportados pelo 'Three.js'.
Objetos podem ser facilmente animados com a alteração da sua rotação,escala,posição,material,vértices,faces e outras propriedades do objeto,com o processamento de cada cena precessada durante o laço de renderização.
Embora não diretamente relacionado com animações,já que vamos estar olhando para as câmeras e animações neste capítulo,é uma boa adição para os assuntos explicados aqui. O que vamos mostrar aqui é como você pode selecionar um objeto da cena utilizando o seu mouse.
Tween.js é uma biblioteca pequena JavaScript que você pode baixar a partir de https://github.com/sole/tween.js,e usar para definir facilmente a transição de uma propriedade entre dois valores. Todos os pontos intermediários entre o início eo fim valor são calculados para você. Este processo é chamado de interpolação.
A maioria dos controles usados permitem que você use o mouse para mover-se facilmente,se deslocar aplicar zoom na cena.
Controles da movimentação da câmera como em um simulador de voo,com uso do teclado e do mouse.
Uma versão mais simples dos FlyControls. Permite que você mova em torno do eixo Z.
Como o nome indica,o controle de primeira pessoa usando a classe FirstPersonControls permite o controle da câmera como um caminhante em primeira pessoa. O mouse é usado para olhar em volta e teclado é utilizado para caminhar. Controles que se comportam como aqueles jogos de tiro em primeira pessoa (FPS).
O controlador OrbitControl é uma ótima maneira de usar o mouse ou o teclado para girar e deslocar um objeto em torno de outro no centro da cena,como um satélite orbitando um planeta.
Com este controle a posição da câmera se move em torno de um caminho predefinido. Você pode compará-lo com um passeio de montanha-russa onde você pode olhar ao seu redor,mas não tem nenhuma influência sobre sua posição.
Metas Morph Manuais.
Movimentação da Mão.
Carregar e Animar Blender.
Carregar e Animar Collada.
Carregar e Animar MD2.
Carregar e Animar GLTF.
10
Carregamento e Trabalho com Texturas
Carregamento e Trabalho com Texturas
No capítulo 4 os conceitos sobre materiais disponíveis no 'Three.js' foram explicados,e nesse capítulo serão apresentados os conceitos sobre as texturas utilizas nos materiais das malhas da cena. Primeiro com exemplos mais básicos sobre como carregar e aplicar uma textura,evoluindo para criação de texturas usando shaders personalizados através da criação de um vértice e um fragmento sombreador. Saiba sobre: carregando texturas em 'Three.js' e aplicando a uma malha,o uso de mapas 'bump' e normais na aplicação de profundidade e detalhe para uma malha,a criação de sombras falsas usando um mapa de luz,a adição de reflexão detalhada a um material que utiliza um mapa do ambiente,o uso de um mapa especular para definir o 'brilho' de partes específicas da malha,o ajuste fino do mapeamento com a personalização do mapeamento UV de uma malha e o uso da tela HTML5 e do elemento de vídeo como entrada para uma textura.
Fragmento Básico de Shader.
Vértice Básico de Shader.
Mapa de Ambiente (Environment Map) dinâmico.
Objeto MTL Normal.
O objeto da classe DDSLoader carrega arquivos com o formato DDS como textura para o material.
O objeto da classe PVRLoader carrega arquivos com o formato PVR como textura para o material.
O objeto da classe TGALoader carrega arquivos com o formato TGA como textura para o material.
Textura Básica.
Um mapa de relevo (bump map) é usado para adicionar mais profundidade a um material. Neste exemplo a parede esquerda parece muito mais detalhada e com mais profundidade,quando comparada com a parede à direita. Isto é feito definindo uma textura adicional,o chamado mapa de relevo,no material.
Mapa Normal (Normal Map).
Mapa de Luz (Light Map).
Calcular reflexos do ambiente é muito ruim para o desempenho da CPU. Se você quiser usar reflexos em 'Three.js',você ainda pode fazer isso,mas você vai ter que fingir. Você pode fingir-lo,criando uma textura do ambiente em que o objeto está,e aplicar isso para o objeto específico.
Calcular reflexos do ambiente é muito ruim para o desempenho da CPU. Se você quiser usar reflexos em 'Three.js',você ainda pode fazer isso,mas você vai ter que fingir. Você pode fingir-lo,criando uma textura do ambiente em que o objeto está,e aplicar isso para o objeto específico.
Com um mapa especular você pode definir um mapa que configura o brilho e o realce da cor de um material.
Mapeamento UV Manual.
Vamos começar com um olhar mais profundo mapeamentos UV. Quando você cria uma geometria em 'Three.js',esses mapeamentos também serão criados automaticamente com base no tipo de geometria que criou.
Quando você aplica uma textura a uma geometria criada pelo 'Three.js',ele vai tentar aplicar a textura com a melhor qualidade possível. Há,no entanto,situações em que você não quer que a textura se espalhe em torno de um rosto completo ou a geometria completa,mas que se repita. O 'Three.js' fornece uma funcionalidade detalhada que permite controlar isso.
Exemplo mostrando texturas com o canvas.
Como vimos no início deste capítulo,podemos criar uma textura enrugada simples,usando um mapa de relevo. Quanto maior a intensidade de um pixel neste mapa,quanto maior o enrugamento. Desde que um mapa de relevo é apenas uma imagem em preto e branco,nada nos impede de criar este em uma tela e usar essa tela como uma textura para o mapa de relevo.
A utilização de um vídeo como entrada para uma textura é muito fácil. Primeiro,nós precisamos ter um elemento de vídeo para reproduzir o vídeo. Então podemos configurar o 'Three.js' para usar este vídeo como entrada para uma textura.
Textura com Vídeo.
11
Shaders Personalizados e Pós-Processamento
Shaders Personalizados e Pós-Processamento
Estamos chegando ao final,e neste capítulo veremos o principal recurso da biblioteca 'Three.js' que não tínhamos abordado: o pós-processamento. Além deste assunto no capítulo,nós também vamos apresentar como você pode criar shaders personalizados. Os principais pontos que discutiremos neste capítulo são as seguintes: a criação de uma biblioteca 'Three.js' para o pós-processamento,o processamento básico fornecido pelo 'Three.js',como BloomPass e FilmPass,aplicação de efeitos a uma parte da cena usando máscaras,usando as TexturePass para armazenar os resultados prestados,utilizar o ShaderPass para adicionar efeitos básicos de pós-processamento,tais como filtros sépia,efeitos de espelho,e ajustes de cor,utilizar o ShaderPass para vários efeitos obscuros e filtros mais avançados e a criação de um efeito personalizado de pós-processamento escrevendo um shader simples.
Composições básicas de efeitos.
Passagem Simples de Pós-Processamento.
Passagem Glitch.
Máscaras de Pós-Processamento.
Passagem Simples de Shader.
Passagem de Shader com Borrão.
Passagem de Shader Avançada.
Passagem de Shader Personalizada.
12
Adicionando Física na Cena com Physijs
Adicionando Física na Cena com Physijs
Neste capítulo final vamos olhar para outra biblioteca que você pode usar para estender o básico funcionalidade de 'Three.js'. A biblioteca que vamos discutir neste capítulo é chamada Physijs. Physijs é uma biblioteca que lhe permite introduzir física em sua cena 3D. De física,queremos dizer que nossos objetos estão sujeitos à gravidade,eles podem colidir uns com os outros,podem ser deslocados pela aplicação de impulso,etc. Esta biblioteca faz uso de outra biblioteca de física chamada ammo.js. A primeira coisa que precisamos fazer é criar uma cena 'Three.js' que pode ser usada com Physijs. Faremos isso em nosso primeiro exemplo.
Cena Básica.
Propriedades do Material.
Formas (Shapes).
Restrições.
Restrições DOF.
12.06
Ver
Áudio.
12.07
Ver
Hinge.