Upload
robert-maxwell
View
55
Download
9
Embed Size (px)
Citation preview
1
UNIVERSIDADE FEDERAL DO PIAUÍ – UFPI
CAMPUS SENADOR HELVÍDIO NUNES DE BARROS - CSHNB
BACHARELADO EM SISTEMAS DE INFORMAÇÃO
Robert Maxwell Loureno da Silva
WebGL, a inovação em 3D para navegadores
PICOS
2011
2
UNIVERSIDADE FEDERAL DO PIAUÍ – UFPI
CAMPUS SENADOR HELVÍDIO NUNES DE BARROS - CSHNB
BACHARELADO EM SISTEMAS DE INFORMAÇÃO
Robert Maxwell Loureno da Silva
WebGL, a inovação em 3D para navegadores
Trabalho de Conclusão de Curso apresentado ao
Curso de Bacharelado em Sistemas de
Informação do Campus Senador Helvídio
Nunes de Barros da Universidade Federal do
Piauí como parte para obtenção do Grau de
Bacharel em Sistemas de Informação. Área de
concentração: Sistemas de Informação. Sob
orientação do Professor e Msc. Rayner Gomes
Sousa.
PICOS
2011
3
UNIVERSIDADE FEDERAL DO PIAUÍ – UFPI
CAMPUS SENADOR HELVÍDIO NUNES DE BARROS - CSHNB
BACHARELADO EM SISTEMAS DE INFORMAÇÃO
Robert Maxwell Loureno da Silva
WebGL, a inovação em 3D para navegadores
Trabalho de Conclusão de Curso aprovado
pelos membros da Banca Avaliadora , aceita
pelo Curso de Bacharelado em Sistemas de
Informação e homologada pelo Campus
Senador Helvídio Nunes de Barros da
Universidade Federal do Piauí como parte para
obtenção do Grau de Bacharel em Sistemas de
Informação.
Data de Aprovação: ___/___/_____.
Prof. Msc. Rayner Gomes Sousa ____________________________________________UFPI
Prof. Msc. Algeir Prazeres Sampaio__________________________________________UFPI
Profa. Esp. Patrícia Vieira da Silva Barros _____________________________________UFPI
5
Agradecimentos
A Deus, pela condição de poder me aperfeiçoar e por me manter firme mesmo nas dificulda-
des.
A minha família, pela tolerância e compreensão depositada em mim, que me acompanharam
sempre nos meus estudos, incentivando e ajudando no que for possível para que eu possa ter
habilidades e capacidades de decidir o meu futuro.
Ao meu orientador Rayner, pela sugestão do tema e pela paciência durante a orientação.
Aos meus amigos pelo companheirismo e apoio.
Um especial agradecimento aos meus colegas de curso pelos bons e maus bons momentos que
passamos juntos e que não foram poucos, superando e ultrapassando cada obstáculo que atra-
vessasse pelos nossos caminhos.
6
O mundo está nas mãos daqueles que tem a coragem de sonhar e
correr o risco de viver os seus sonhos.
Paulo Coelho
7
Resumo
O presente trabalho apresenta uma visão geral de como a tecnologia 3D está presente nos
principais meios de entretenimento, como jogos, cinema e Web, e assim, ressalta a Web, onde
são listadas tecnologias que permite a visualização de conteúdos 2D e 3D diretamente em
navegadores, como a WebGL, objeto de estudo desta monografia. Essa tecnologia permite o
desenvolvimento de aplicações tridimensionais que podem ser visualizadas diretamente em
navegadores compatíveis. Ainda em relação à WebGL, são apresentadas suas características,
estrutura, vantagens, desvantagens, navegadores suportados, frameworks disponíveis e são
discutidas as suas principais funções relacionadas a conteúdos 3D. A monografia finaliza com
a criação de pequenas práticas de modelagens, elaboradas fazendo uso de um framework em
WebGL, o Three.js e com as considerações finais acerca de todo o trabalho construído.
Palavras-chave: WebGL, 3D, navegadores.
8
Lista de Figuras
1. Cartaz do filme The Power of Love, o primeiro filme em 3D .............................................. 17
2. Super Mario Bros, um clássico dos jogos desenvolvidos em plataforma 2D....................... 19
3. Quake I, um marco na história dos jogos em 3D.................................................................. 19
4. Exemplo de um fogão 3D presente na Web .......................................................................... 21
5. Colheita Feliz, jogo desenvolvido em Flash, disponibilizado na rede social Orkut ............ 24
6. Imagens com e sem retorção ................................................................................................ 26
7. Tela inicial do Unity.............................................................................................................. 27
8. Jogo Quake 2, executado em um navegador ........................................................................ 30
9. Componentes que integram a WebGL .................................................................................. 31
10. Os mecanismos de um ataque WebGL ............................................................................... 36
11. Os navegadores mais utilizados de outubro de 2010 a outubro de 2011 ............................ 37
12. Habilitação da WebGL no navegador Chrome ................................................................... 38
13. Habilitação da WebGL no navegador Firefox .................................................................... 38
14. Objeto 3D do framework C3DL ......................................................................................... 40
15. Objeto 3D do framework CopperLicht ............................................................................... 41
16. Interface do CopperCube.................................................................................................... 42
17. Objeto 3D do framework GLGE ........................................................................................ 42
18. Objetos 3D do framework SpiderGL .................................................................................. 43
19. Arquitetura do SpiderGL .................................................................................................... 44
20. Objeto 3D do framework Three.js ...................................................................................... 44
21. Estrutura do arquivo index.html.......................................................................................... 46
22. As coordenadas de um objeto 3D ....................................................................................... 48
23. Resultado exibido executado em um navegador ................................................................ 55
24. Pasta examples do Three.js ................................................................................................. 56
25. Pasta custom do Three.js .................................................................................................... 57
26. Notepad++ em execução ................................................................................................... 58
27. Esfera criada a partir da biblioteca Three.js, visualizada no navegador Firefox ................ 60
28. Estrutura do arquivo index.html.......................................................................................... 61
29. Cubo 3D criado a partir da biblioteca Three.js ................................................................... 66
9
Lista de Tabelas
1. Parte do conteúdo HTML da página especificando o elemento canvas ............................... 50
2. Função webGLStart .............................................................................................................. 50
3. Função initBuffers ................................................................................................................ 51
4. Função drawScene ................................................................................................................ 52
5. Função initGL ....................................................................................................................... 53
6. Função initShaders ............................................................................................................... 53
7. O shader-fs e shader-vs ........................................................................................................ 54
8. Primeiras linhas do código em HTML ................................................................................. 58
9. Variáveis geométricas ........................................................................................................... 59
10. Especificação da renderização e aplicação da cor a esfera ................................................. 59
11. Variáveis geométricas ......................................................................................................... 60
12. Declaração das funções extras do Three.js ......................................................................... 62
13. Variáveis globais ................................................................................................................. 62
14. Função init .......................................................................................................................... 63
15. Função animate .................................................................................................................. 64
16. Função onMouseDown ....................................................................................................... 64
17. Função onMouseMove ........................................................................................................ 64
18. Função onMouseUp ............................................................................................................ 65
19. Função onMouseOut ........................................................................................................... 65
10
Lista de Siglas
API Application Programming Interface
CPU Central Processing Unity
C3DL 3D Canvas JS Library
DOM Document Object Model
GLSL OpenGL Shading Language
GPU Graphics Processing Unity
HTML Hyper Text Markup Language
HTTP HyperText Transfer Protocol Secure
OpenGL Open Graphics Library
OpenGL ES Open-GL for Embedded Systems
PHP Hypertext Preprocessor
SVG Scalable Vector Graphics
UI User Interface
URL Uniform Resource Locator
WHATWG Web Hypertext Application Technology Working Group
WebGL Web Graphics Library
W3C World Wide Web Consortium
XML Extensible Markup Language
11
Sumário
LISTA DE FIGURAS ............................................................................................................. 08
LISTA DE TABELAS ........................................................................................................... 09
LISTA DE SIGLAS ............................................................................................................... 10
1. INTRODUÇÃO .................................................................................................................. 13
1.1 ORGANIZAÇÃO DA MONOGRAFIA ........................................................................ 14
2. TECNOLOGIAS 3D E ÁREAS DE ATUAÇÃO ............................................................ 16
2.1 INDÚSTRIA CINEMATOGRÁFICA ........................................................................... 17
2.2 JOGOS ............................................................................................................................ 18
2.2.1 Jogos para consoles e PC’s ................................................................ 18
2.2.2 Jogos online ....................................................................................... 20
2.3 WEB ............................................................................................................................... 21
3. TECNOLOGIAS GRÁFICAS PARA NAVEGADORES .............................................. 23
3.1 FLASH ............................................................................................................................ 23
3.2 SILVERLIGHT .............................................................................................................. 25
3.3 SVG ................................................................................................................................ 25
3.4 UNITY ............................................................................................................................ 27
4. WEBGL, 3D DIRETAMENTE NOS NAVEGADORES ................................................ 29
4.1 TECNOLOGIAS QUE INTEGRAM A WEBGL ........................................................... 30
4.1.1 OpenGL ............................................................................................. 31
4.1.2 OpenGL ES ....................................................................................... 32
4.1.3 HTML 5 ............................................................................................. 33
4.1.4 Canvas ............................................................................................... 33
4.2 VANTAGENS ................................................................................................................ 34
4.3 DESVANTAGENS ........................................................................................................ 35
4.4 NAVEGADORES QUE SUPORTAM WEBGL ............................................................ 36
4.4.1 Chrome .............................................................................................. 37
4.4.2 Firefox ............................................................................................... 38
4.4.3 Opera ................................................................................................. 39
4.4.4 Safari .................................................................................................. 39
4.5 BIBLIOTECAS DE DESENVOLVIMENTO OU FRAMEWORKS ............................ 40
4.5.1 C3DL ................................................................................................. 40
4.5.2 CopperLicht ....................................................................................... 41
4.5.3 GLGE ................................................................................................ 42
4.5.4 SpiderGL ........................................................................................... 43
4.5.5 Three.js .............................................................................................. 44
5. FUNÇÕES PRINCIPAIS EM WEBGL ........................................................................... 45
5.1 CONCEITOS, COMPONENTES E INTERAÇÕES ...................................................... 45
5.1.1 Buffer ................................................................................................. 46
5.1.2 Matrizes ............................................................................................. 46
12
5.1.3 Renderização ..................................................................................... 47
5.1.4 Shader ................................................................................................ 47
5.1.5 Vértice ............................................................................................... 48
5.2 DESCRIÇÃO DO EXEMPLO ....................................................................................... 49
5.3 TABELAS DE CODIFICAÇÃO E EXPLICAÇÃO ....................................................... 49
5.4 RESULTADOS .............................................................................................................. 55
6. DESENVOLVIMENTO DE OBJETOS 3D COM O THREE.JS .............................. 56
6.1 DESENVOLVIMENTO DE UMA ESFERA SEM MOVIMENTO .............................. 57
6.1.1 Resultados .......................................................................................... 60
6.2 DESENVOLVIMENTO DE UM CUBO 3D INTERATIVO ......................................... 60
6.2.1 Resultados .......................................................................................... 65
7. CONSIDERAÇÕES FINAIS .......................................................................................... 67
Anexo A – Código Fonte referente ao Capítulo 5................................................................. 69
Anexo B – Código Fonte referente ao Capítulo 6 ................................................................ 72
Anexo C – Código Fonte referente ao Capítulo 6 ................................................................ 73
REFERÊNCIAS ..................................................................................................................... 75
13
Capítulo 1
Introdução
De acordo com o chefe da International Telecomunication Union [17] (União
Internacional de Telecomunicações), Hamadoun Touré1, já no início de 2011, a quantidade de
usuários de Internet já alcançava o número de dois bilhões de pessoas. Hoje em dia, boa parte
das pessoas utiliza a Internet para acessarem informações e se conectarem com pessoas e
eventos ao redor do mundo a todo o momento. Muitas dessas experiências proporcionadas
pela rede mundial de computadores são possíveis devido a uma Web aberta que pode ser
acessada por qualquer pessoa por meio de um navegador, em qualquer dispositivo conectado à
Internet no mundo.
Segundo Garrott e Ferreira (1999), os dias em que os utilizadores ficavam
satisfeitos com as simples páginas estáticas do HTML já pertencem ao passado. A Internet
está em constante mudança, surgindo com novas funcionalidades e novas técnicas. Uma
dessas técnicas fornece aplicações para serem executadas diretamente no browser, como os
programas de e-mail e processadores de texto. Os internautas querem mais agilidade e
praticidade ao navegar na Web, exemplo disso é o desejo de quererem utilizar ferramentas que
sejam executadas a partir do navegador a terem que ficar instalando complementos adicionais,
os chamados plug-ins. Isso é uma das pretensões da tecnologia 3D pra Web.
Gráficos em 3D podem ser atraentes apresentando aspectos como iluminação,
sombras, reflexos e texturas realísticas. Porém, uma dificuldade encontrada, se relaciona ao
fato de se apresentar uma experiência em 3D convincente, em especial na Internet, pois criar
uma experiência em 3D envolvendo jogos, site e outros meios, exige grandes quantidades de
dados para exibir texturas e formas complexas. Nos anos da expansão da Internet, na década
de 90, essas grandes quantidades de dados exigiam mais largura de banda de Internet e mais
capacidade de computação do que boa parte dos sistemas computacionais poderia suportar.
Tudo isso para dizer que quanto mais complexo for a geometria do modelo e de materiais
utilizado, mais pesado computacionalmente torna o modelo 3D e maior a largura de banda de
que este requer quando este for disponibilizado na Web (Sousa, 2001). Com a chegada da
tecnologia 3D para os navegadores, a realidade é outra.
A tecnologia 3D em navegadores cresce devido a diversos fatores e que tem se
1 http://www.itu.int/en/osg/Pages/biography.aspx
14
consolidado com a popularização da conexão a Internet via banda larga (Ciriaco, 2009).
Dessa maneira, as possibilidades para o envio de expressivas quantidades de dados pela rede
mundial de computadores, dados esses que são necessários para exibir experiências realísticas
em 3D nos navegadores, melhoraram e permitiram a expansão da tecnologia 3D. Além disso,
os processadores e as memórias com o tempo se aperfeiçoaram de tal forma, que mesmo um
notebook ou desktop padrão suportam a complexidade de gráficos em 3D.
Outro ponto importante, que deve ser destacado é que além das melhorias em
relação à Internet e aos sistemas computacionais, os grandes avanços conseguidos nas
capacidades dos navegadores tiveram um grande impacto. Diversos navegadores modernos
adotaram tecnologias como a WebGL, onde os desenvolvedores podem criar efeitos
tridimensionais para seus aplicativos da Web, e os usuários podem experimentá-los sem a
necessidade de plug-ins adicionais.
Este trabalho apresenta a WebGL, um novo padrão, que ainda encontra-se em fase
de elaboração, que traz uma completa série de recursos 3D diretamente para a Web. Com as
pesquisas realizadas surgiram novas descobertas que aumentaram ainda mais o interesse e a
motivação, que foi a de buscar outras possibilidades para o desenvolvimento de aplicações 3D
para a exibição em navegadores além das existentes, como o Flash e Silverlight. Uma nova
possibilidade vem com a WebGL, que leva aos desenvolvedores um ambiente de programa-
ção e a não necessidade de plug-ins para a criação de seus projetos tridimensionais para que
tudo possa ser visualizado em navegadores compatíveis com a tecnologia. Os avanços conse-
guidos até agora com essa tecnologia, tornaram a WebGL mais acessível aumentando em lar-
ga escala, o número de utilizadores e a própria demanda dos mundos virtuais na Internet. Nes-
se campo, prevê-se um avanço maior nos próximos tempos, visto que a WebGL se torna mais
uma opção aos desenvolvedores de modelagens 3D para Web.
1.1 Organização da Monografia
Capítulo 1: Introdução - Apresenta uma visão geral do trabalho;
Capítulo 2: Tecnologia 3D e Áreas de atuação - Este capítulo faz uma breve explica-
ção sobre o que venha ser a tecnologia 3D e suas principais áreas de atuação;
Capítulo 3: Tecnologias gráficas para navegadores - São apresentadas tecnologias grá-
ficas para navegadores, semelhantes à WebGL;
15
Capítulo 4: WebGL, 3D diretamente para os navegadores - É detalhada a WebGL, a-
bordando sua estrutura, características, vantagens e desvantagens. Destaca-se também
os navegadores compatíveis e frameworks disponíveis em WebGL;
Capítulo 5: Funções principais em WebGL - Seção de funções relacionadas ao desen-
volvimento em WebGL;
Capítulo 6: Desenvolvimento de objetos 3D com o Three.js - São apresentadas práti-
cas de modelação de objetos 3D para a Web fazendo uso da biblioteca Three.js, inclu-
indo as etapas e os resultados conseguidos;
Capítulo 7: Considerações Finais - Neste capítulo serão apresentadas as conclusões e
lições aprendidas com a realização deste trabalho.
16
Capítulo 2
Tecnologia 3D e Áreas de atuação
Ao processo de desenvolvimento de qualquer representação matemática de um
objeto tridimensional, seja ele estático ou animado, através do uso de software especializado,
é dado o nome de modelagem 3D. O produto desse processo é chamado modelo 3D e pode ser
exibido como uma imagem bidimensional através de um processo chamado renderização 3D,
cujo conceito é descrito na seção 5.1.3 do Capítulo 5, ou usado em simulação de fenômenos
físicos em computador.
Em três dimensões pode-se prover uma organização mais intuitiva de objetos espa-
ciais, utilizando a percepção natural e memória do utilizador referente ao espaço e a
relação espacial dos objetos representados. A Realidade Virtual também pode esti-
mular a atração e o entendimento do utilizador por meio de sua interatividade e di-
namismo (Fosse, 2004).
Os modelos 3D normalmente são criados por programas especializados em
modelagem 3D, como o Blender. No entanto, como os modelos 3D são uma coleção de
dados, como pontos, faces e outras informações, eles podem ser criados manualmente,
algoritmicamente ou digitalizados.
A tecnologia em terceira dimensão está se tornando cada vez mais comum no
cotidiano das pessoas e, aos poucos, se consolida como a nova febre do mundo do
entretenimento (Giambruno, 2002).
São inegáveis os grandes avanços conseguidos através da inserção da tecnologia
3D nos grandes meios de entretenimento. A tecnologia 3D está presente no cinema, televisão,
na Web, nos jogos, enfim, nos meios onde mais atraem a atenção das pessoas. A tendência é
que em poucos anos, ir ao cinema para assistir a um filme em terceira dimensão deixará de ser
um programa especial e será algo bem natural.
Atualmente há muitas áreas onde a tecnologia 3D está presente e se expandindo.
Áreas essas, como filmes, jogos, Web e outras que não são mencionadas aqui, que buscam a
integração de diversas mídias (texto, imagem, vídeo, áudio, animação) proporcionadas pela
tecnologia 3D. Este capítulo apresenta brevemente como a tecnologia 3D está atuando entre
alguns dos meios de entretenimento existentes, como no cinema, jogos e Web.
17
2.1 Indústria cinematográfica
O primeiro filme em três dimensões foi "The Power of Love" de 1922 (ver Figura
1), sobre uma mulher que é prometida a um homem que não ama para salvar o pai da bancar-
rota. No entanto "Bwana Devil" (1952) é conhecido como o precursor do gênero.
Fonte: Top Filmes Online, 2011
Fig. 1: Cartaz do filme The Power of Love, o primeiro filme em 3D.
A década de 50 ficou marcada nos Estados Unidos pela invasão dos aparelhos de
televisão nos lares americanos. As pessoas sumiram das salas de cinema para se aconchega-
rem no sofá de casa. Assim, os produtores dos estúdios decidiram criar algo para fazer o pú-
blico voltar às salas de cinema. Surgia a técnica naturalvision, que consistia em uma imagem
anáglifa que passa a ter um efeito estereoscópico (tridimensional) quando visualizada por um
óculos feito de cartolina e lentes de plástico azul e vermelho, os conhecidos óculos 3D. O
cérebro une a imagem da cor vermelha sobreposta à cor azul e assim cria a ilusão do efeito em
três dimensões.
Muitos filmes passaram a ser produzidos no formato 3D. "House of Wax" (1953),
"Spooks!" (1953) e "The Stewardesses" (1969) foram alguns deles. Porém, com a baixa quali-
dade nas produções, o formato foi extinto. Apenas um título e outro como "Tubarão 3D"
(1983) e "A Hora do Pesadelo 6 - Pesadelo Final - A Morte de Freddy" (1991) surgiu depois.
Se nos anos 50, o advento da TV foi o que afastou o público dos cinemas, agora é a Internet
que faz com que as pessoas passem mais tempo em casa em frente à tela do computador. Por
18
isso, o 3D é resgatado das cinzas com a promessa de levar as pessoas de volta às salas de pro-
jeção e vivenciarem uma incrível experiência cinematográfica.
O retorno do 3D ao cinema foi em meados de 2000 com a empresa RealD a frente
da implantação da tecnologia em salas de cinema. Muitos filmes dessa nova fase são docu-
mentários sobre esportes, natureza e o espaço. "Magnificent Desolation: Walking on the Moon
3D" (2005) é um exemplo.
2.2 Jogos
Um dos principais meios de entretenimento, os jogos, sem dúvidas, foram e estão
sendo os mais beneficiados com a tecnologia 3D. O nível de realismo que a tecnologia 3D
proporciona aos jogos, tanto para os jogos online como os para computadores e consoles, é o
seu maior diferencial. A seguir é apresentada uma contextualização de como a tecnologia 3D
está atuando entre os jogos para PC’s, consoles e também entre os jogos online.
2.2.1 Jogos para consoles e PC’s
Como aconteceu na indústria cinematográfica, a animação 3D demorou em in-
gressar no mundo dos jogos eletrônicos para PC’s e consoles (vídeo-games).
O aparecimento do PC (Personal Computer – Computador Pessoal) e da indústria
dos games para computador permitiu que os jogos eletrônicos se tornassem uma “febre” na
era da informática. Os jogos aumentaram em quantidade, em variedade de temas e ganharam
uma impressionante qualidade gráfica com um maior realismo.
O impulso da produção de jogos 3D iniciou com a necessidade de aperfeiçoamen-
to dos tradicionais jogos em 2D, como o Super Mario Bros (ver Figura 2). Antigamente, os
jogos eram desenvolvidos em 2D, que ao invés de utilizarem coordenadas vetoriais e o inten-
so uso de texturas para compor o ambiente 3D, os desenvolvedores se limitavam em utilizar
simples bitmaps e ambientes bidimensionais, como grandes papéis de paredes para esta tarefa,
além de se basearem em animações estáticas para dar realismo aos personagens. Este arranjo
funcionou durante os primeiros tempos, mas com a chegada de recursos computacionais mais
poderosos e uma classe de jogadores mais exigentes, inovações foram necessárias para aten-
derem essas necessidades e exigências.
19
Fonte: Portallos, 2011
Fig. 2: Super Mario Bros, um clássico dos jogos
desenvolvidos em plataforma 2D.
Logo depois dos jogos 2D e com a evolução dos computadores e vídeo-games,
vieram os jogos em 3D. Nasceram os FPS (First Person Shooter), mais conhecidos como jo-
gos em primeira pessoa, tipo de game onde o jogador possui a mesma perspectiva de visão do
personagem, ou seja, ele passa a enxergar o ambiente como se estivesse dentro do próprio
jogo. Nos primeiros tempos, surgiram FPS's clássicos consagrados como o Wolfeinstein 3D, o
(próprio) Doom, o ROTT, o Hexen, o Duken Nuken 3D, o Heretic, o Blood, o Star Wars, entre
outros. Embora fossem excelentes jogos 3D para a época, a qualidade gráfica ainda deixava a
desejar, pois os motores gráficos eram baseados no uso de texturas fixas de baixa resolução,
causando o efeito visual "pixelado" com a aproximação de qualquer elemento do jogo, seja
objeto ou personagens.
Em 1996, mais um novo marco na história dos jogos em 3D surge, o Quake (ver
Figura 3). Diferente dos demais jogos FPS do gênero, a plataforma do Quake utilizava coor-
denadas aritméticas (vértices) para compor o ambiente 3D, além da utilização de texturas para
preencher os seus elementos, dando maior realismo e riqueza de detalhes aos cenários criados.
Mas por outro lado, uma série de complexidades entrou em cena, exigindo maiores conheci-
mentos técnicos e habilidades dos programadores, além de mais recursos de hardware.
Fonte: Hardware, 2011
Fig. 3: Quake I, um marco na história dos jogos em 3D.
20
O hardware teve que ser otimizado e adaptado a nova realidade em jogos. O uso
intensivo de cálculos matemáticos para criar e renderizar os cenários e o pesado processamen-
to paralelo executado pela CPU (Central Processing Unity – Unidade Central de Processa-
mento) não eram suficientes, pois não possuía o poder de cálculo necessário para realizar todo
este trabalho. Surge então, a GPU (Graphics Processing Unity – Unidade de Processamento
Gráfico), uma unidade de processamento aritmética dedicada especialmente a processar cálcu-
los gráficos. Diferente das CPUs, as GPUs conseguem realizar um número expressivo de cál-
culos, devido à sua arquitetura paralelizada. Assim, vários detalhes das cenas são calculados
simultaneamente como construção do ambiente 3D, aplicação de iluminação, sombra e textu-
ras, perspectiva do personagem, sendo finalmente renderizados para gerar as bonitas imagens
que se costuma ver.
Por trás de todos esses jogos, há um enorme investimento por parte das indústrias
de games, cujo objetivo é o de melhorar os elementos de hardware e software para que os
jogos sejam os mais realísticos possíveis.
2.2.2 Jogos online
A Internet evoluiu e ampliou a sua presença nos lares ao redor do mundo. Aplica-
ções com novas tecnologias, novas ferramentas e mais usabilidade surgem em uma completa
linha de produtos e serviços que está ao alcance de qualquer um sem que haja a necessidade
sequer de sair de casa.
A mesma facilitação e diversidade podem ser percebidas em relação à
disponibilidade de jogos online. Os jogos online, que podem ser rodados diretamente no
navegador, se destacam com um grande crescimento. Segundo uma pesquisa divulgada no site
do G1 [12], o tamanho do mercado online de jogos será superior a US$ 13 bilhões em 2012.
Muito mais do que simples disponibilização em um repositório de jogos, os jogos
3D online dispensam muitos jogadores da compra de máquinas poderosas e de jogos caros,
propiciando diversão e entretenimento para uma grande massa de admiradores dos jogos 3D
online e liberando-os também dos altos custos dos jogos para PC.
Com os avanços tecnológicos disponíveis atualmente, os que estão em desenvol-
vimento, como a WebGL, e os que ainda virão, os arquivos criados serão sempre mais leves e
carregados com maior rapidez. Os jogos 3D online futuramente ainda ganharão ainda mais
21
realismo e maior profundidade de cenários e de cores, e permitirão ainda ao jogador, a experi-
ência de mergulhar verdadeiramente numa realidade virtual.
2.3 Web
A Web é outra área onde os objetos 3D são utilizados frequentemente. Nela, a
tecnologia 3D se manifesta das mais variadas formas, tanto como em sites de jogos, como já
foi apresentado, bem como em sites de compras. Os produtos virtuais interativos permitem ao
utilizador examinar, por exemplo, características de um fogão (ver Figura 4).
Fonte: Electro-Cesar, 2011
Fig. 4: Exemplo de um fogão 3D presente na Web.
A Web, criada por um grupo de cientistas comandados por Tim Berner-Lee, do
CERN (Centre European Research Nucleare), na Suíça, que em português significa, "Rede de
Alcance Mundial", é um sistema de documentos em hipermídia que são interligados e execu-
tados na Internet. Os documentos podem estar na forma de vídeos, sons, hipertextos e figuras.
Para visualizar a informação, pode-se usar um programa de computador chamado navegador
para descarregar informações (também chamadas de “documentos” ou “páginas”) de servido-
res web (ou "sítios") e mostrá-las na tela do usuário. O usuário pode então seguir as hiperliga-
ções na página para outros documentos ou mesmo enviar informações de volta para o servidor
para interagir com ele. O ato de seguir hiperligações é, usualmente, chamado de "navegar" ou
"surfar" na Web. A funcionalidade da Web é baseada em três padrões:
Um protocolo de transmissão de dados - HTTP;
Um sistema de endereçamento próprio - URL;
22
Uma linguagem de marcação, para transmitir documentos formatados através da rede -
HTML
Com a ferramenta Web, hoje a Internet ganhou espaço e está em qualquer área
desde os comércios, jogos, filmes, educação, entre outras. Em 1994, os especialistas aborda-
ram a possibilidade de integrar objetos 3D na Web (Ledwidge, 2002). A partir daí, esse ano
tornou uma nova era para Web, isto porque várias organizações específicas juntaram e mobili-
zaram esforços para criar uma tecnologia capaz de integrar objeto 3D na Web e assim permitir
uma maior interação e dinamismo para os usuários. Hoje, a tecnologia 3D para Web é uma
área de grande crescimento, permitindo uma visualização mais interativa e instigante que a
tecnologia 2D.
Uma das razões para o sucesso de objetos tridimensionais na Web é a possibilida-
de de interação em tempo real, permitindo aos utilizadores desencadear ações como manipu-
lar, rodar, etc., o objeto 3D.
Hoje, existe uma variedade enorme de plataformas e ferramentas 3D para a Web
que permitem a visualização de objetos 3D online sem qualquer hardware específico, como a
WebGL. Para este trabalho, a Web terá maior destaque sendo abordada especificamente a
WebGL, uma biblioteca que permite o desenvolvimento de objetos 3D que possam ser visua-
lizados diretamente nos navegadores. No próximo capítulo serão apresentadas outras tecnolo-
gias, que assim como a WebGL, permitem a criação de aplicações 3D para a exibição em na-
vegadores, sendo que a WebGL, objeto de estudo desta monografia, terá um capítulo a parte.
23
Capítulo 3
Tecnologias gráficas para navegadores
As tecnologias que existem atualmente, incluindo as que estão em
desenvolvimento, como a WebGL, demonstram melhorias consideráveis tanto em nível de
interfaces gráficas bem como em ganhos conseguidos em termos de qualidade sobre as
imagens e com tecnologia muito mais intuitiva e acessível para a maioria dos utilizadores.
Algumas delas, como o Flash, estão buscando se aperfeiçoarem para atingirem um maior
público, cada vez mais exigente.
Neste capítulo são apresentadas em ordem alfabética, quatro tecnologias
semelhantes à WebGL, Flash, Silverlight, SVG e Unity, voltadas para o desenvolvimento de
jogos e animações online que podem ser exibidas diretamente no navegador e que são
consideradas suas concorrentes.
3.1 Flash
Em 1995, a Futurewave recebeu inúmeros pedidos de usuários para a criação de
um software específico voltado para a criação de animações. Com a popularização da
Internet, a Futurewave decidiu aprimorar seu programa chamado Smartsketch para usar Java
e renderizar um player de Internet e recebeu nome de Cellanimator, e depois tendo o nome
mudado para Future Splash Animator. No ano de 1996, a Macromedia uniu-se a Futurewave e
comprando-a pouco tempo depois. A Macromedia, então, mudou o nome do sistema até então
conhecido como Future Splash Animator para Flash 1.0. Em 2005 a Adobe2 compra a
Macromedia e em 2007 é finalmente lançado para o público o Adobe Flash CS3.
Em se tratando de popularidade, a WebGL ainda tem muita estrada pra percorrer
para alcançar o Flash. Segundo o site da Info [16], ele está presente em 98% dos
computadores e apesar de tanta popularidade em relação a gráficos vetoriais e animação 2D
na Web, ele ainda não possui o suporte para desenvolvimentos em 3D.
Segundo Alvares (2004), existem dois tipos de gráficos: os gráficos vetoriais e em
mapa de bits. Os gráficos vetoriais, nos quais uma imagem é representada a partir de linhas ou
2 http://www.adobe.com
24
vetores, possuem determinadas propriedades, como cor, espessura, etc. A qualidade deste tipo
de gráficos não depende do zoom ou do tipo de resolução com o qual se esteja olhando o
gráfico.
Os gráficos de mapa de bits se assemelham a uma espécie de quadrículo no qual
cada um dos quadrados (píxels) mostra uma cor determinada. A informação destes gráficos é
salva individualmente para cada píxel e é definida pelas coordenadas e cor de tal píxel. Estes
tipos de gráficos são dependentes da variação do tamanho e resolução, podendo perder quali-
dade ao modificar sucessivamente suas dimensões.
Fonte: Google Discovery, 2009
Fig. 5: Colheita Feliz, jogo em 2D desenvolvido em Flash,
disponibilizado na rede social Orkut.
Boa parte dos jogos acessados através do navegador é baseada no formato Flash.
A grande presença de jogos e aplicativos desenvolvidos em Flash presentes nas grandes redes
sociais, como o Orkut (ver Figura 5) e Facebook é uma prova disso. Além de exportar
arquivos com uma grande compactação, a ferramenta é acessível aos desenvolvedores. Isso
justifica o fato do Flash possuir legiões de programadores e interessados pelo planeta.
Como resultado de sua popularidade, o plug-in Flash Player é compatível com
praticamente qualquer navegador, como o Firefox, por exemplo, e já vem nativamente
instalado em suas versões mais recentes. Independente do sistema operacional utilizado como
o Mac, Linux ou Windows, o Flash está sempre atualizado e presente.
Ainda é cedo pra afirmar que a tecnologia Flash é um forte concorrente da
WebGL, pois o que a WebGL tem que o Flash ainda não tem é suporte para exibição de
conteúdo 3D em navegadores. Uma versão da ferramenta com suporte 3D já foi anunciada
pela Adobe, mas, inicialmente, tudo indica que ela suportará apenas formatos de vídeo.
25
3.2 Silverlight
O Silverlight, criado pela Microsoft, é um plug-in gratuito com suporte a vários
navegadores e várias plataformas, destinado a fornecer experiências de mídia, como vídeos e
aplicativos interativos, como jogos para a Web. Assim como a WebGL, essa tecnologia é nova
e ainda está em fase de testes. O Silverlight proporciona um modelo de programação, com
suporte, por exemplo, para Ruby e linguagens como C.
Entre os recursos de mídia do Silverlight, está a oferta rápida e econômica de áu-
dio e vídeo de qualidade para todos os principais navegadores, inclusive Firefox, Safari e In-
ternet Explorer, executados em Mac ou Windows. A ferramenta se agrega a estes navegadores
e adiciona novas funções a eles, permitindo que eles sejam capazes de executar filmes e ani-
mações no formato Flash e outros recursos interativos disponíveis na Internet.
Com anos de tradição o Flash pela primeira vez encontrou um forte concorrente:
o Silverlight. São percebíveis o bom desempenho e qualidade de transmissão de vídeo do Sil-
verlight, onde uma de suas vantagens é o carregamento, bem rápido e com pouco buffer.
Empresas de entretenimento especializadas na produção de filmes, séries e ani-
mações, como a Twentieth Century Fox, já estão fazendo uso da tecnologia através de testes
em trailers. Assim como o SVG, que será apresentado na próxima seção, o Silverlight permite
a criação de gráficos vetorizados, como textos, animações e sobreposições que interagem com
gráficos e efeitos de boa qualidade. O Silverlight é disponível para download gratuitamente
em sua página oficial no site da Microsoft3.
3.3 SVG
O SVG (Scalable Vector Graphics – Vetor de Gráficos Escalável) é um formato
de gráficos vetoriais que trabalha com a criação de linhas, polígonos, figuras, textos e como a
WebGL, permite a exibição desses conteúdos em navegadores compatíveis.
Criado pelo W3C4 (World Wide Web Consortium), empresa responsável pela cria-
ção de outros padrões, como o HTML, o SVG contem tags especificas para gerar uma ima-
gem vetorizada na sua aplicação. Com tags simples, consegue-se através do SVG gerar ima-
gens de qualidade vetorizadas que por mais que sejam alteradas as proporções na tela essa não
3 http:// www.microsoft.com/silverlight
4 http:// www.w3.org
26
perderá qualidade, por ser uma imagem vetorizada. Podendo ser apenas imagem fixa ou ani-
mação, o SVG pode ser trabalhado junto ao JavaScript para manipular eventos de imagem.
Quando se trabalha com imagens que necessitam de uma grande riqueza de deta-
lhes e com sua exibição em uma aplicação, como por exemplo, uma página na Web, essa ima-
gem precisa ser salva com uma grande qualidade, ou seja, essa imagem vai ter um grande
tamanho e um maior custo de armazenamento. Agora, caso se queira economizar espaço, a
imagem vai ser gerada com uma qualidade menor e ao ser expandida, essa imagem irá se dis-
torcer, espalhando os pixels e deixando visível isso. A Figura 6, exibida a seguir, apresenta
duas imagens, uma com distorção e a outra sem distorção.
Fonte: Devmedia, 2011
Fig. 6: Imagens com e sem retorção.
Como no SVG os dados são escaláveis, a imagem pode ser redimensionada sem
preocupação quanto à qualidade e distorção dessa imagem, e ainda por ser apenas um arquivo
XML (Extensible Markup Language – Linguagem de Marcação Extensível), apenas texto, o
custo de armazenamento é muito inferior como o de exibição.
Muitas aplicações para celulares hoje já estão utilizando o SVG, pois como a
maioria dos aplicativos não possui um grande potencial de hardware, e é menos custoso exibir
imagens e armazenar com essa extensão.
Da mesma maneira como a WebGL, o SVG é um padrão aberto, onde qualquer
usuário pode utilizá-lo no desenvolvimento das mais diversas aplicações, sem qualquer restri-
ção, o que não se atribui ao Flash, Silverlight e Unity. WebGL tem linguagem padrão, o Ja-
vaScript e o SVG, tem linguagem padrão o XML.
27
3.4 Unity
Enquanto a plataforma 3D no Flash ainda é uma expectativa entre os
desenvolvedores e a WebGL ainda encontra-se em desenvolvimento, o Unity (ver Figura 7)
também conhecido como Unity3D está em plena funcionalidade. Para fazer uso dessa
tecnologia, o usuário deve ter seu plug-in instalado no computador para poder ter acesso a
jogos com gráficos 3D elaborados para serem exibidos diretamente no navegador.
Fonte: Unity Technology, 2011.
Fig. 7: Tela inicial do Unity.
Unity3D possui cinco licenças diferentes, cada uma para certo tipo de
desenvolvedor. As licenças são: Unity, Unity Pro, Unity iPhone Basic, Unity iPhone
Advanced e Unity Wii. De acordo com a Unity Technologies, em breve mais plataformas serão
suportadas, tais como Android. Todas as licenças são brevemente descritas a seguir:
Unity 3D: Esta é a versão gratuita da Unity que pode ser usada tanto para estudos
quanto para fins comerciais, válida para empresas que não ganharam 100.000 dólares
no ultimo ano fiscal. Ou seja, com um ganho superior a 100.000 dólares deve-se obter
a Unity Pro. Esta versão possui menos recursos que a Unity Pro, mas é totalmente
possível criar um jogo de qualidade com esta licença.
Unity Pro: Esta é a versão paga da Unity e possui diversos recursos interessantes, per-
feita para estúdios ou para o desenvolvedor que tem bons recursos financeiros para in-
vestir. Ela custa $1.200 (mil e duzentos dólares).
Unity iPhone Basic e Unity iPhone Advanced: Estas versões são para o desenvolvi-
mento para iPhone (dispositivo da Apple). As diferenças entre a Basic e Advanced es-
tão mais na parte de desempenho e customização tais como o uso de plug-ins feitos em
28
C++. Os preços são respectivamente 300 dólares pela Basic e 1200 dólares pela Ad-
vanced.
Unity Wii: Esta versão permite o desenvolvimento para o console Nintendo Wii. O u-
suário que se interessar por esta versão deve ser desenvolvedor autorizado da Ninten-
do e entrar em contato com a Unity Technologies para obter os preços e para baixar a
versão.
O Unity tem compatibilidade com os navegadores: Camino, Chrome, Firefox, In-
ternet Explorer, Opera e Safari. Além do Unity3D existem outros programas auxiliares para o
desenvolvimento de um jogo. Segue aqui uma lista desses programas, sendo gratuitos:
Blender: Ferramenta para modelagem e animação de objetos 3D.
Audacity: Editor de audio open source.
Gimp: Editor de imagens.
Inkscape: Para criação de desenhos.
Melody Raiser: Programa de geração de música procedural.
SFXR: Programa de geração de efeitos sonoros.
O Unity possui uma versão gratuita, disponível em seu site oficial na Internet, que
contém a maioria das funcionalidades que um desenvolvedor amador necessita para criar jo-
gos e publicá-los como programa para Windows ou em uma página web. Esses jogos para
sites funcionam de um modo parecido com os jogos ou animações para sites criados em Fla-
sh, sendo necessário que a pessoa instale um plug-in para que eles funcionem. Esse plug-in é
um programa que é encontrado no site oficial do Unity5 e é semelhante ao plug-in do Flash,
ou seja, consegue-se jogar através do navegador, como o Internet Explorer e Firefox.
5 http://www.unity3d.com/webplayer
29
Capítulo 4
WebGL, 3D diretamente nos navegadores
A disponibilização de conteúdo 3D através da plataforma Web passou a ser um
tema de interesse de padrões, como a OpenGL6 (Open Graphics Library – Biblioteca de Grá-
ficos Aberta), em virtude do crescimento da capacidade dos computadores pessoais, pois os
mesmos tornaram-se suficientemente poderosos para lidar com cenas 3D em tempo real. Mui-
tas tentativas foram feitas para permitirem que o usuário através da Web acessasse e interagis-
se diretamente com objetos tridimensionais, ou, mais especificamente, dentro do browser.
No mesmo período de tempo em que as GPUs mostraram um expressivo aumento
de desempenho e capacidade, a evolução da tecnologia por trás dos navegadores Web também
permitiu a expansão do conteúdo 3D na Web. Assim, de um lado, os componentes de hardwa-
re e software atingiram um nível de eficiência e performance que poderiam atender às exigên-
cias de alta qualidade e renderização de conteúdo 3D, do outro, o aumento da largura de ban-
da para acesso à Internet permitiu grandes volumes de dados a serem transferidos em uma
quantidade de tempo relativamente curta. Neste cenário, a necessidade de uma API padroni-
zada se tornou um problema de alta prioridade a ser resolvido.
O Khronos Group [29], instituição responsável pela criação e manutenção da O-
penGL e de outras bibliotecas, lançou na GDC (Game Developers Conference) 2011 a versão
1.0 da especificação WebGL (Web Graphics Library – Biblioteca de Gráficos para a Web),
que trata-se de uma tecnologia em desenvolvimento que transporta o poder gráfico de placas
de vídeo de computadores para os navegadores, agora capazes de suportar jogos avançados e
outras aplicações em 3D, até antes reservados a outras tecnologias, como o Silverlight.
WebGL é considerada uma API (Application Programming Interface - Interface
de Programação de Aplicativos), pois trata-se de um conjunto de funções que a permite se
comunicar com uma outra biblioteca. Nesse caso, ela se comunica com a OpenGL ES (Open-
GL for Embedded Systems – OpenGL para Sistemas Embarcados) [23], aproveitando seus
recursos. Ela surgiu a partir de pequenas experiências em 3D, fazendo uso do elemento can-
vas do HTML 5, iniciadas pela Fundação Mozilla7, que faz parte do Khronos Group.
6 http:// www.opengl.org
7 http://www.mozilla.org/foundation
30
Mesmo sendo uma tecnologia ainda em desenvolvimento, já existem jogos e ou-
tras aplicações desenvolvidas com a tecnologia WebGL. Exemplo disso é a segunda versão do
jogo Quake (ver Figura 8), produzido pela Google. Para que o usuário tenha acesso a esse
jogo é necessário ter um navegador habilitado com WebGL e uma boa placa de vídeo. Entre
os navegadores compatíveis com o Quake 2 estão o Firefox 4, Chrome Beta 5.0 e Web-
kit/Safari: Nightly builds. No site do PlayWebGL8, é possível encontrar esse jogo e outros
além de alguns demos produzidos com tecnologia WebGL.
Fonte: Osnews, 2011
Fig. 8: Jogo Quake 2, executado em um navegador.
4.1 Tecnologias que integram a WebGL
WebGL é multi-plataforma, ou seja, é desenvolvida fazendo a combinação das
tecnologias OpenGL, OpenGL ES, HTML 5 e o elemento canvas. Além da integração dessas
tecnologias, a WebGL faz interface entre a linguagem JavaScript e OpenGL ES 2.0, uma
biblioteca de código nativo que acessa diretamente o hardware de placas gráficas e o
processamento é feito em canvas, uma superfície de visualização gráfica que faz parte do
HTML 5 e está implementado com vários navegadores. A seguir são apresentados com mais
detalhes os elementos que integram a WebGL destacando suas funcionalidades em relação a
conteúdos gráficos. A Figura 9 apresenta os componentes que integram a API WebGL.
8 http://www.playwebgl.com
31
Fig. 9: Componentes que integram a WebGL.
4.1.1 OpenGL
A OpenGL é uma especificação que define uma API que permite a escrita de a-
plicações utilizando gráficos 2D ou 3D.
Por se tratar de uma especificação, a OpenGL é apenas um documento que des-
creve um conjunto de funções e seus comportamentos. A partir dessa especificação, fornece-
dores de hardware desenvolvem suas implementações e estas são projetadas de modo que a
biblioteca esteja de acordo com a especificação. Para que suas implementações sejam aceitas
como uma versão da OpenGL, as bibliotecas criadas pelos fornecedores são submetidas a
testes para assegurar sua qualidade.
A OpenGL possui implementações eficientes para as plataformas Mac OS X,
Windows, Linux. A OpenGL também pode ser usada em software, permitindo que plataformas
sem suporte de fornecedores a OpenGL possam executar programas que a usam. Além de
possuir implementações para diversas plataformas, a OpenGL também possui bindings para
muitas linguagens, como Delphi, Fortran, Haskell, Java, PHP, Ruby e Visual Basic.
A OpenGL foi projetada para realizar apenas a saída gráfica e, portanto, apenas
fornece funções de renderização (ver mais sobre renderização no Capítulo 5). Seu núcleo des-
conhece o conceito de sistemas de janelas, áudio ou dispositivos de entrada como mouse. Essa
32
decisão de projeto permite que o processo de renderização seja completamente independente
do sistema operacional utilizado, permitindo o desenvolvimento multiplataforma.
4.1.2 OpenGL ES
WebGL tem sintaxe da OpenGL ES [23], uma versão da OpenGL desenvolvida
exclusivamente para ser executado em smathphones ou celulares modernos, de modo que a
vizualização de aplicativos 3D em websites seja possível também em telefones. Muitas das
funções presentes no desenvolvimento de aplicações em 3D na WebGL são oriundas do
OpenGL ES, como shader. OpenGL ES é uma interface de software que consiste em um
conjunto de procedimentos e funções que permite ao programador especificar os objetos e
operações envolvidas na produção de imagens de boa qualidade gráfica, mais especificamente
imagens coloridas de objetos tridimensionais.
Para o programador, OpenGL ES é um conjunto de comandos que permite a
especificação de objetos geométricos em duas ou três dimensões, juntamente com os
comandos que controlam o modo como esses objetos são prestados no framebuffer.
Framebuffer é uma memória especializada em armazenar e transferir para a tela do
computador dados de um quadro de imagem. As informações armazenadas nesta memória
consistem basicamente em valores cromáticos para cada pixel e suas transparências. Quanto
maior a resolução da imagem retratada maior será a memória necessária para o framebuffer
armazenar as imagens (Rodrigo Prada, 2009). A sintaxe de OpenGL aplicados a WebGL será
apresentada em detalhes no Capítulo 5.
OpenGL ES oferece uma interface de modo imediato, o que significa que a
especificação de um objeto faz com que seja desenhado. Um programa típico que usa
OpenGL ES começa com chamadas para abrir uma janela para o framebuffer em que o
programa vai desenhar. Então, as chamadas são feitas para alocar um contexto OpenGL ES e
associá-lo com a janela.
A maioria das versões da OpenGL ES requer a existência de um framebuffer nos
hardwares de gráficos específicos. Muitas chamadas OpenGL ES pertencem a objetos de
desenho, tais como pontos, linhas e polígonos, mas as maneiras que alguns destes desenhos
ocorrem dependem da existência de um framebuffer. Além disso, algumas das versões do
OpenGL ES dizem respeito especificamente à manipulação de framebuffer.
33
4.1.3 HTML 5
A tecnologia HTML 5, assim como a própria Web, está em constante evolução,
com base nas necessidades e imaginação dos desenvolvedores. Sendo um padrão aberto, o
HTML 5 incorpora alguns dos melhores aspectos da Web: funciona em qualquer lugar e em
qualquer dispositivo com um navegador moderno.
HTML é a sigla em inglês para Hyper Text Markup Language, que em português,
significa Linguagem para Marcação de Hipertexto. O conceito de hipertexto admite um
número de considerações e discussões. Para o bom entendimento das definições, pode-se
resumir hipertexto como todo o conteúdo inserido em um documento para a Web e que tem
como principal característica a possibilidade de se interligar a outros documentos da Web. O
que torna possível a construção de hipertextos são os links, presentes nas páginas dos sites que
se visitam quando se está na conectado na Internet. O HTML evoluiu por sete versões que
são: HTML, HTML +, HTML 2.0, HTML 3.0, HTML 3.2, HTML 4.0, HTML 4.01 (versão
atual), HTML 5 (versão em desenvolvimento, que se relaciona com o WebGL).
Uma das novidades do HTML 5 é o canvas, novo componente que permite
desenhar na página, por meio das funções de uma API, tipo de formas, que poderão estar
animadas e interagir com o usuário.
4.1.4 Canvas
No final da seção anterior foi apresentado que uma das novidades da nova versão
do HTML 5 é o canvas. Canvas significa em português algo como tela, ou seja, uma área
onde se pode desenhar como se fosse uma tela.
O elemento canvas permite especificar uma área da página onde se pode, através
de scripts, desenhar e renderizar imagens, o que amplia notavelmente as possibilidades das
páginas dinâmicas e permite fazer coisas que até agora estavam reservadas aos
desenvolvedores em Flash, por exemplo.
O canvas se desenvolveu inicialmente pela Apple para incorporá-lo ao navegador
Safari, e logo foi utilizado e padronizado pela organização WHATWG9 para integrá-lo ao
HTML 5. Logo depois, também foi adotado por navegadores como Firefox e Opera. Em
relação ao Chrome, como é um navegador que utiliza o mesmo motor de renderização que o
9 http://www.whatwg.org/
34
Safari, portanto também suporta o elemento canvas. O Internet Explorer até a versão 8.0, não
suportava canvas com funções nativas, porém existem projetos e plug-ins que podem ampliar
as funcionalidades do navegador para dar suporte a este novo elemento do HTML 5. Por
exemplo, existe o projeto Explorer Canvas que preparou um plug-in para que o navegador da
Microsoft tenha o suporte para desenho 2D que permite canvas. Entretanto, embora em
diversas frentes populares começassem a se utilizar canvas, a falta de suporte do Internet
Explorer faz com que ainda não seja muito recomendável sua incorporação às aplicações
Web, pois a maioria dos usuários, que utilizam o Internet Explorer, não poderia ver as partes
da página onde se utiliza canvas. Essa situação pode mudar durante os próximos anos, visto
que a incorporação de canvas ao HTML 5 já é uma realidade. O Internet Explorer mais cedo
ou mais tarde terá que dar suporte a esta utilidade em seu navegador, senão sua utilização será
descartada por usuários que desejarem acessar aos serviços Web mais avançados.
O elemento do HTML 5 permite desenhar na página e atualizar dinamicamente
estes desenhos, por meio de scripts e atendendo às ações do usuário. Isso leva a possibilidades
de uso como as disponíveis com o plug-in do Flash, no que se refere à renderização de
conteúdos dinâmicos. As aplicações abrangem jogos, efeitos dinâmicos em interfaces de
usuário, editores de código, editores gráficos, aplicações, efeitos 3D, etc.
Atualmente, aplicações inovadoras para a Web já utilizam canvas para seu
funcionamento, onde se destaca a WebGL, objeto de estudo desta monografia.
4.2 Vantagens da WebGL
Uma das vantagens da WebGL é a capacidade de ser usada para construir gráficos
3D para páginas na Web sem a necessidade de instalação de algum plug-in. Um plug-in é uma
parte adicional de software, especializada em processar tipos específicos de conteúdo
(Google, 2010). Esses plug-ins estão presentes em similares a WebGL, como o Flash, Unity e
o Silverlight. A não necessidade de instação de plug-ins é o maior diferencial entre a WebGL
e seus concorrentes. Para cumprir tal tarefa sem a necessidade de complementos, a WebGL
aumenta a qualidade da renderização 3D em navegadores, aproveitando o processamento das
placas de vídeo compatíveis.
Além de não haver necessidade de complementos adicionais, WebGL conta
com outra vantagem interessante, que torna um diferencial a respeito dos seus similares.
WebGL é open source. Open Source significa que a tecnologia WebGL é de utilização livre,
35
para quem quiser desenvolver e se aventurar nesse mundo. E todos podem contribuir com a
tecnologia WebGL, seja no seu desenvolvimento, seja na correção de erros, seja na
documentação, desde que a condição de liberdade seja mantida. Isso significa maiores
possibilidades de resultados e ganhos em termos de produtividade. Resultado disso é a grande
quantidade de frameworks relacionados à WebGL, espalhados pela Internet. Os principais
frameworks serão apresentados ainda neste capítulo.
Pra quem gosta de programação, a WebGL é completa. Além de programar
fazendo uso da linguagem de marcação de textos, HTML, o desenvolvedor também utiliza
linguagem JavaScript. Isso pode ser uma vantagem ou mesmo, uma desvantagem, justamente
para quem não tem familiaridade com programação para Web.
4.3 Desvantagens da WebGL
Por ser uma tecnologia que se aproveita de comandos da OpenGL, mais
precisamente da OpenGL ES, com integração de outras tecnologias, a WebGL se apresenta a
seus usuários como uma linguagem complexa e com muitos detalhes técnicos relacionados a
conteúdos gráficos. WebGL é um ambiente de pura programação. Tem que carregar, compilar,
vincular e configurar os shaders (apresentados com mais detalhes no Capítulo 5), para manter
as formas, e configurar as variáveis. Isso refere-se a comandos da OpenGL. O conhecimento
em OpenGL é muito significativo, mas não é tudo. A WebGL é destinada principalmente a
pessoas com conhecimentos em algoritmos de computação gráfica, mas com boa
compreensão em termos relacionais a gráficos 3D. É difícil, quando se vê o código pela
primeira vez, mesmo se tendo uma boa compreensão da linguagem OpenGL.
Além da linguagem complexa, a WebGL se apresenta como um código malicioso
para os navegadores. Pesquisadores de segurança descobriram uma perigosa vulnerabilidade
no padrão WebGL, presente tanto no Firefox 4 quanto no Chrome, usados para a exibição de
gráficos 3D. WebGL pode ser uma “porta de entrada” para crackers invadirem o sistema,
infectando-o com vírus ou até roubando dados pessoais do usuário.
Segundo o Net Security [21], WebGL permite que programas baseados na Internet
acessem componentes gráficos de driver e hardware, deixando-os expostos a códigos
maliciosos, como mostra a Figura 10. Em geral, eles não são construídos tendo a segurança
como uma das principais preocupações, pois as empresas confiam que a instrução que chega a
tal área do sistema é, invariavelmente, segura. Esses problemas são inerentes à especificação
36
da WebGL e exigem mudanças significativas da arquitetura para remediá-los e fizeram com
que o Internet Explorer até hoje, não aderisse a nova “onda” em 3D para navegadores, como o
Firefox, Safari, Opera e Chrome fizeram.
O usuário, se quiser, pode desabilitar a WebGL, mas isso pode prejudicar sua
experiência online. A tendência é que o padrão ganhe mais proteção nos próximos anos, já
que, se continuar com essas falhas em sua segurança, poderá deixar de ser utilizado.
Fonte: Forshaw, 2011
Fig. 10: Os mecanismos de um ataque WebGL
Navegadores que ativam a WebGL por padrão, como o Chrome e o Firefox
colocam seus usuários em risco com esses problemas. A seguir, são listados os navegadores
que já suportam a tecnologia WebGL.
4.4 Navegadores que suportam WebGL
Os objetos 3D são visualizados na Web através de um navegador compatível. Se-
gundo Vaz (2002), navegador é uma aplicação utilizada para efetuar pesquisas e consultar
informações que existem nos vários sites, localizados em servidores remotos para acesso via
Internet.
Atualmente são compatíveis com a tecnologia WebGL, os navegadores Firefox, o
Chrome, o Safari e o Opera. O Internet Explorer da Microsoft ainda não anunciou planos para
apoiar oficialmente a WebGL, isso acontece por questões de segurança já apresentadas na
37
seção anterior. A Figura 11 representa um gráfico que apresenta os navegadores mais utiliza-
dos no mundo entre os meses de outubro de 2010 a outubro de 2011, segundo dados estatísti-
cos presentes na página na Internet do Stat Counter [26].
Fonte: Stat Counter, 2011
Fig. 11: Os navegadores mais utilizados de outubro de 2010 a outubro de 2011.
Nem sempre a versão oficial destes navegadores suporta WebGL, e sendo assim,
torna-se necessário fazer o download de uma versão do navegador já habilitado com a tecno-
logia WebGL, ou fazer isso manualmente, através de pequenas alterações em algumas de suas
configurações específicas para tal procedimento.
4.4.1 Chrome
O browser desenvolvido pela Google chegou ao mercado em 2008 e em relação
aos navegadores com suporte WebGL, o Chrome é um dos navegadores mais utilizados no
que diz respeito ao desenvolvimento de objetos tridimensionais. Um bom exemplo disso é o
site do Chrome Experiments10
, que contém uma série de experimentos 3D em WebGL fazen-
do uso do navegador.
É possível instalar o Chrome nas principais versões do sistema operacional Win-
dows (XP/Vista/7) e também no Linux e Mac. A versão 9 do Google Chrome vem com supor-
te WebGL ativado por padrão e por isso não há a necessidade de habilitá-lo.
10
http://www.chromeexperiments.com/webgl
38
Para habilitar WebGL em versões antigas do Chrome, deve-se inicializar o C-
hrome pela linha de comando adicionando a opção -enable-webgl. A linha de comando será
algo como mostra a Figura 12.
Fig. 12: Habilitação da WebGL no navegador Chrome.
4.4.2 Firefox
O Firefox foi o navegador que permitiu as primeiras experiências em WebGL,
sendo assim um dos percussores da tecnologia 3D para Web. Desenvolvido pela Fundação
Mozilla, chegando ao mercado em novembro de 2004, o Firefox é distribuído gratuitamente
para usuários dos principais sistemas operacionais. A sua evolução é contínua, destacando-se
principalmente no suporte a complementos.
Para fazer funcionar WebGL no Firefox, precisa-se baixar sua versão 4 e ser digi-
tado na barra de endereços o comando about:config, como mostra a Figura 13.
Fig. 13: Habilitação da WebGL no navegador Firefox.
Uma lista de configurações será aberta que podem ser alteradas. Deve ser encon-
trado o registro webgl-enabled ou algo assim e valor de false deve ser modificado para true.
39
O navegador Firefox foi o escolhido para as práticas de modelagens o estudo de
caso apresentado no capítulo 6. Mesmo com WebGL integrada, foi encontrada uma certa difi-
culdade em habilitar a WebGL no navegador Chrome, o que não aconteceu em relação ao
Firefox, e sendo assim, isso influenciou na sua escolha para a visualização dos conteúdos cri-
ados nas práticas de modelagens logo mais apresentadas.
4.4.3 Opera
O navegador Opera11
criado em 1994, não é tão popular quanto o Chrome e Fire-
fox. Com o objetivo de aumentar sua popularidade e aumentar a sua participação no mercado,
que atualmente é de 1,76%, segundo dados do serviço de estatísticas StatCounter [26], os de-
senvolvedores do Opera anunciaram que a versão 12 de seu navegador terá uma melhor acele-
ração via hardware, indo da mais simples renderização de páginas de texto, até as mais pesa-
das animações. Além disso, o Opera 12 terá HTML5 e dará suporte a WebGL, o que deixa o
Internet Explorer como o único navegador que não inclui a tecnologia.
A aceleração gráfica dos navegadores via hardware, além de uma necessidade pa-
ra suportar os novos padrões da Web, como por exemplo, a tecnologia 3D, é uma forma de
separar o processamento entre CPU e placa gráfica, melhorando o desempenho do computa-
dor e até ajudando a economizar energia, com menos processos no CPU, o chip aquece menos
e uma menor quantidade de energia é desperdiçada. A versão completa do Opera 12 estará
disponível no final do ano de 2011.
4.4.4 Safari
Desde o lançamento da WebGL, houve progressos significativos em todos os
principais produtos do setor, principalmente em relação ao navegadores, Firefox, Chrome e
também com o Safari. A comunidade de desenvolvedores da Apple apenas decidiu oficializar
os trabalhos com WebGL meses depois do lançamento, oferecendo informações para seus
contribuidores começarem a trabalhar com ela.
O navegador da Apple também conta com a possibilidade de instalação de
extensões, assim como o Firefox. Safari 5.1 tem suporte para WebGL, mas está desativado
por padrão. Desde outubro de 2009, os nightly builds do WebKit estão sendo liberados com
11
http://www.opera.com/download
40
suporte a WebGL. A versão do navegador com WebGL habilitada encontra-se disponível para
baixar no site12
da WebKit.
4.5 Bibliotecas de desenvolvimento ou frameworks
Para a produção de gráficos 3D, WebGL fornece bibliotecas que podem ser
aplicadas a qualquer caso de uso. As bibliotecas, ou frameworks, fornecem uma API em cima
da WebGL sendo adaptadas a áreas específicas, acrescentando assim uma camada de
conveniência a WebGL que podem acelerar e simplificar o desenvolvimento.
Framework é uma abstração que une códigos comuns entre vários projetos de
software podendo atingir uma funcionalidade específica, por configuração, durante a
programação de uma aplicação (Cassao, 2011)
Mesmo ainda não estando plenamente desenvolvido, já existem frameworks em
diversas áreas e abordagens específicas, destinados a facilitar a geração de aplicações em
WebGL. São apresentados em ordem alfabética alguns frameworks relacionados à WebGL.
4.5.1 C3DL
O C3DL [05] (3D Canvas JS Library) é uma biblioteca em JavaScript
desenvolvida pela rede de pesquisa CATGames que faz uso do elemento canvas, o percussor
da WebGL. A Figura 14 apresenta um globo terrestre desenvolvido com C3DL.
Fonte: C3DL, 2011
Fig. 14: Objeto 3D do framework C3DL.
12
http://nightly.webkit.org
41
Essa biblioteca, assim como outros frameworks, trabalha com a manipulação de
cenas, conteúdos matemáticos e classes de objetos 3D que faz a API WebGL mais acessível
para os desenvolvedores que desejam produzir conteúdos 3D no browser sem a necessidade
de terem um profundo conhecimento em programação 3D, o que é necessário para seu
funcionamento. Sua página na Internet contém uma série de tutoriais e toda a documentação
para quem deseja iniciar algum projeto fazendo uso da biblioteca C3DL. O download do
framework é disponibilizado em seu site oficial na Internet.
4.5.2 CopperLicht
O CopperLicht13
é mais uma biblioteca gratuita em JavaScript para a criação de
jogos e aplicações 3D para visualização diretamente no browser. Desenvolvido pelo Ambiera
[01], esse framework faz uso da API WebGL, suportada por navegadores modernos. O
CopperLicht vem com um editor 3D, o CopperCube e as características necessárias para criar
jogos em 3D no browser, como manipulação de cores, textura e etc.
Fig. 15: Objeto 3D do framework CopperLicht.
O CopperCube é um software pra edição de programas 3D, visualizações
arquitetônicas, simulações militares (veja Figura 15) e jogos. Esse software converte os
modelos 3D criados para serem exibidos em sites através de arquivos swf, do Flash ou html,
da WebGL. Pra quem não é familiarizado com programação e deseja desenvolver aplicações
3D simples chegando as mais avançadas e sem escrever uma linha de código, o CopperCube é
13
http://www.ambiera.com/copperlicht
42
uma opção. O software CopperCube é disponibilizado para download no site da Ambiera14
.
Fonte: Ambiera, 2011
Fig. 16: Interface do CopperCube.
4.5.3 GLGE
GLGE [11] é uma biblioteca de programação em JavaScript destinada a facilitar a
utilização de WebGL, permitindo o uso à aceleração do hardware para o desenvolvimento de
aplicações 2D ou 3D sem a necessidade de baixar nenhum plug-in. Suas principais caracterís-
ticas são: nevoeiro, sombras com profundidade, reflexões e refrações, animações e filtros em
2D.
Fig. 17: Objeto 3D do framework GLGE.
O objetivo inicial do GLGE era a criação de jogos em plataforma 2D. Na época
só havia uma biblioteca que serviu como base para seu desenvolvimento, o C3DL, mas não
oferecia os recursos necessários para a produção de jogos. Conforme o tempo passava, mais e
mais recursos foram adicionados ao GLGE e a biblioteca rapidamente ultrapassou seus propó-
14
http://www.ambiera.com/coppercube
43
sitos iniciais e tornou-se mais completa em termos de recursos. Atualmente, o objetivo princi-
pal do GLGE ainda é o desenvolvimento de jogos. O download gratuito da biblioteca é dispo-
nibilizado na página oficial do GLGE15
.
4.5.4 SpiderGL
SpiderGL [25] é uma biblioteca de gráficos 3D com linguagem JavaScript que
adere às especificações WebGL para renderização em tempo real. SpiderGL é compatível
entre as principais plataformas de desktop (Windows XP/Vista/7 e Linux).
Fonte: SpiderGL, 2011
Fig. 18: Objetos 3D do framework SpiderGL.
Esse framework fornece estruturas de dados e algoritmos para facilitar o uso de
WebGL, para definir e manipular formas, para importar modelos 3D em vários formatos, e
para lidar com carregamento de dados assíncronos. O framework SpiderGL é formado por seis
componentes principais. São eles: GL, Math, Space, Mesh, UI e DOM.
GL: Baixo/alto nível WebGL acessar recursos de renderização;
Math: Matrizes e vetores com funções básicas, funções de álgebra linear e classes;
Space: Estruturas geométricas e espaciais, classes e algoritmos;
Mesh: Conjunto de vértices com suas informações de conectividade;
UI (User Interface – Interface do Usuário): Manipulação de eventos do tipo GLUT. O
elemento canvas gera eventos que são interceptados pelo módulo de UI e expedidos
para a objeto registrado;
DOM: JS / HTML utilitários, carregamento de conteúdo assíncrono.
15
http://www.glge.org
44
Fonte: SpiderGL, 2011
Fig. 19: Arquitetura do SpiderGL.
SpiderGL oferece uma interface para desenvolvimento em WebGL, e também
vários gráficos 3D e recursos de programação geral, que vão desde a álgebra linear até o
carregamento de conteúdo assíncrono. Esse framework está disponível para download em sua
página16
oficial na Internet.
4.5.5 Three.js
Three.js, assim como as outras bibliotecas, é uma interface em JavaScript que
busca facilitar o desenvolvimento de objetos 3D tirando proveito da API WebGL. Essa biblio-
teca foi escolhida para um estudo de caso, onde é apresentada com mais detalhes no capítulo
6. A Figura 20 mostra um objeto 3D criado com Three.js.
Fig. 20: Objeto 3D do framework Three.js.
16
http://www.spidergl.org
45
Capítulo 5
Funções principais em WebGL
Apresenta-se WebGL como uma API de renderização 3D projetada para a web,
derivada do OpenGL ES 2.0. Tem função de processamento semelhante à OpenGL, mas em
conjunto com o HTML 5. WebGL é estruturada como um ambiente de processamento 3D para
o elemento canvas do HTML.
Iniciar o desenvolvimento de aplicações 3D com WebGL não é algo simples por
várias razões. Primeiramente, a especificação WebGL simplesmente se refere à documentação
OpenGL ES e aponta diferenças. Mesmo o desenvolvedor tendo um conhecimento em
OpenGL, existem algumas diferenças notáveis e indesejáveis entre ela e a WebGL.
A respeito dos navegadores, pode-se usar qualquer um, desde que esteja
habilitado com WebGL, como o Chrome. Tudo deve funcionar em qualquer navegador
habilitado com WebGL, caso contrário deve-se habilitar manualmente. É necessário, antes da
criação de um projeto em 3D, verificar se o navegador é capaz de exibir uma página com
WebGL e, para isso, há aplicações já prontas na Internet justamente com esse intuito.
Este capítulo apresenta o desenvolvimento de objetos geométricos, mais
especificamente um triângulo e um quadrado, com base no Learning WebGL [18], uma página
na Internet que apresenta vários tutoriais de desenvolvimento em WebGL distribuídos do mais
simples aos mais avançados. O exemplo escolhido faz uso de conceitos específicos
relacionados à criação de objetos tridimensionais, que integram a API WebGL. O objetivo
deste capítulo é mostrar o funcionamento desses conceitos aplicados ao desenvolvimento de
objetos 3D. São explicados apenas trechos do código, destacando as principais funções. O
código completo é apresentado na página 70, no Anexo A.
5.1 Conceitos, Componentes e Interações
No desenvolvimento em WebGL, é de suma importância tomar-se conhecimento
de funções específicas relacionadas à criação de objetos tridimensionais. Essas funções
relacionam-se ao processo de desenho, coloração, texturização, renderização, armazenamento,
comprimento e largura, e outras. O conhecimento prévio dessas funções dá ao desenvolvedor
46
uma maior clareza quanto à estrutura de sua criação. A Figura 21 representa a estrutura do
arquivo index.html onde estão presentes as funções em JavaScript.
Fig. 21: Estrutura do arquivo index.html.
5.1.1 Buffer
Um buffer é uma região de memória usada para armazenamento temporário de
dados quando um programa ou dispositivo de hardware necessita de um fluxo ininterrupto de
informação. No exemplo apresentado neste capítulo, essa região é representada pela função
initBuffers, referindo-se ao espaço de memória na placa de vídeo onde serão armazenados os
vértices. Para o exemplo apresentado o buffer está representado pela função initBuffers.
5.1.2 Matrizes
Em WebGL, não existem funções de matrizes básicas, portanto, a operação
matemática sobre matrizes deve ser feita pelo implementador. Ao renderizar a cena, há muitas
47
operações que necessitam de estruturas de matrizes. Para realizar esta operação matemática é
consideravelmente difícil e para compreender a execução de operação matrizes, algum
conhecimento de álgebra linear básica é útil. Para representar o conceito de matriz, no
exemplo apresentado neste capítulo, são identificadas as variáveis mat4.identity
mat4.perspective e mvMatrix, onde cada uma delas apresenta uma função específica.
A matriz de perspectiva, mat4.perspective, tem como objetivo fazer as coisas que
estão mais distantes parecerem menores. Os movimentos de translações e rotações do objeto
são realizados em uma matriz, a matriz de identidade, representada por mat4.identity. A matriz
usada para apresentar os movimentos realizados por mat4.identity é chamada de matriz
modelo de exibição, representada pela variável mvMatrix.
5.1.3 Renderização
Renderização é o processo de geração de uma imagem a partir de um modelo uti-
lizando programas de computador. Esse processo pode ser comparado ao ato de tirar uma foto
ou o de filmar uma cena na vida real.
A renderização para mídias interativas, como os jogos e simulações, é calculada e
exibida em tempo real a taxas entre 20 e 120 quadros por segundo. O objetivo da renderização
em tempo real é o de exibir o máximo de informação possível em um quadro. Dessa forma, a
imagem gerada por esse processo não necessariamente representa algo do mundo real, ela
apenas pretende exibir algo real o suficiente para que o olho humano possa tolerar.
À medida que os recursos computacionais avançam o nível de realismo das ima-
gens renderizadas em tempo real aumenta. Esse processo normalmente é auxiliado pela uni-
dade de processamento gráfico (GPU) dos computadores.
Para realizar a renderização 3D, é possível usar uma API gráfica como WebGL
ou pode-se usar um framework, como os apresentados no Capítulo 4, que normalmente abstrai
muitas operações de baixo nível das APIs e permite a geração mais rápida de código.
5.1.4 Shader
Na WebGL existe um elemento responsável por explorar toda a funcionalidade de
placas de vídeo e transportar essas funções para o desenvolvimento de aplicações 3D, trata-se
do shader. O shader permite através do hardware, especificamente a placa de vídeo, a
48
renderização das imagens graficamente construídas em ambiente 3D, para melhor definição,
resolução e visualização.
Nada acontece em WebGL sem shaders, pois eles pegam os dados e os
transformam em pixels na tela. No desenvolvimento do triângulo e quadrado, os shaders estão
representados por fragmentShader e vertexShader, apresentadas a seguir:
fragmentShader: O fragmentShader (também conhecido como pixelShader) é uma
função executada em uma GPU. Com a geração do vertexShader, os pixels dos objetos
são passados para o fragmentShader, que aplicará as propriedades da luz e textura.
vertexShader: O vertexShader é uma função, que assim como o fragmentShader, é e-
xecutado na GPU, usada para adicionar efeitos especiais para objetos em um ambiente
3D. O vertexShader é executado uma vez para cada vértice dado ao processador gráfi-
co. O objetivo é transformar a posição de cada vértice 3D no espaço virtual para a co-
ordenada 2D em que aparece na tela. A função vertexShader pode manipular proprie-
dades como posição, cor e textura. O vertexShader é como os pontos especificados no
espaço serão distribuídos na tela.
5.1.5 Vértice
WebGL depende de um conceito chamado de vértice, que definem a posição de
como os objetos são desenhados. Um vértice é um único ponto no espaço tridimensional que
se expressa por um componente de três vetores. Cada componente deste vetor corresponde a
um eixo no sistema de coordenadas representado como na Figura 22.
Fig. 22: As coordenadas de um objeto 3D.
49
5.2 Descrição do exemplo
O exemplo escolhido para apresentar a relação das funções específicas na criação
de objetos 3D encontra-se disponível na página do Learning WebGL na Internet. Trata-se da
criação de dois objetos geométricos, um triângulo e um quadrado para serem exibidos em
navegadores. Esse exemplo é uma boa introdução aos fundamentos em WebGL, o que dará
suporte suficiente para a criação de objetos mais avançados.
No site do Learning WebGL, o autor desenvolvedor do exemplo alerta para o
nível de conhecimento em relação a programação e a funções relacionadas a conteúdos
gráficos, pois os mesmos são importantes para começar a produzir modelagens 3D para Web.
A próxima seção apresenta a explicação das partes mais importantes do código re-
ferente ao desenvolvimento dos objetos geométricos, fazendo referência às funções particula-
res relacionadas a modelagens gráficas em 3D.
5.3 Tabelas de codificação e explicação
Apresenta-se ao longo desta seção a explicação do código distribuída em tabelas,
onde são resumidas em seis passos principais. São eles:
1. Obter o elemento de tela, o canvas.
2. Inicializar a variável gl para executar o ambiente da OpenGL.
3. Inicializar o vertex shader e fragment shader. Compilar, vincular e carregar o shader para o
WebGL.
4. Inicializar os buffers. Ao construir o objeto, há a coordenação dos pontos, textura e cor e
estes dados devem ser armazenados nos buffers. Estes dados armazenados são necessários
para o processamento.
5. Desenhar a cena.
6. Definir uma função webGLStart, que inicia o processamento no arquivo HTML.
A forma mais correta de se começar a desenhar um objeto 3D é especificando a
área em HTML, com a altura e largura da área onde ficarão posicionados os objetos, passando
o elemento canvas a variável trianguloquadrado, isso é mostrado na Tabela 1 na linha 3.
50
1 <html>;
2 <body>;
3 <canvas id= " trianguloquadrado " style = "border:none;" width =
"500" height = "500"></canvas><br/>;
4 <body onload = "webGLStart();">;
5 <head>.
Tabela 1: Parte do conteúdo HTML da página especificando o elemento canvas.
Em relação ao HTML, basicamente é isso que se precisa, podendo-se adicionar
mais linhas de código a página. A Tabela 2 apresenta a função webGLStart, onde WebGL está
representado por initGL, na linha 3. Ainda na linha 3, initGL faz uma chamada ao canvas.
Além disso, a função webGLStart faz uma referência a outras funções, importantes, como o
shader e buffer, representados respectivamente por initShaders (linha 4) e initBuffers (linha
5), cujo conceitos foram já apresentados.
1 function webGLStart() {;
2 var canvas = document.getElementById("trianguloquadrado");
3 initGL(canvas);
4 initShaders();
5 initBuffers();
6 gl.clearColor(0.0, 0.0, 0.0, 3.0);
7 gl.enable(gl.DEPTH_TEST);
8 drawScene();
9 }.
Tabela 2: Função webGLStart.
Em webGLStart (Tabela 2) são especificadas as principais funções presentes na
criação de um objeto WebGL. A função initGL (linha 3) é responsável por trazer o elemento
canvas para o WebGL, a função initShaders (linha 4) é responsável pela modelação dos
desenhos e a função initBuffers (linha 5) pelo armazenamento dos dados referentes ao
desenho. Ainda em webGLStart é feita uma configuração básica para a tela onde será exibido
o objeto, dizendo que quando a tela for limpa, deve-se transformá-la em preto, através do
comando gl.clearColor (linha 6). A variável gl.clearColor é estruturada com um valor RGBA
(Red, Green, Blue, Alpha) que define cada cor para cada pixel do objeto 3D.
Seguindo com as chamadas as funções presentes em webGLStart, tem-se ainda
initBuffers, apresentada na Tabela 2. Nessa função são declaradas duas variáveis globais,
triangleVertexPositionBuffer, linha 1 e squareVertexPositionBuffer, na linha 2.
51
1 var triangleVertexPositionBuffer;
2 var squareVertexPositionBuffer;
3 function initBuffers() {;
4 triangleVertexPositionBuffer = gl.createBuffer();
5 gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
6 var vertices = [;
7 0.0, 1.0, 0.0,;
8 -1.0, -1.0, 0.0,;
9 1.0, -1.0, 0.0;
10 ];
11 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices),
gl.STATIC_DRAW);
12 triangleVertexPositionBuffer.itemSize = 3;
13 triangleVertexPositionBuffer.numItems = 3;
14 squareVertexPositionBuffer = gl.createBuffer();
15 gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
16 vertices = [;
17 1.0, 1.0, 0.0,;
18 -1.0, 1.0, 0.0,;
19 1.0, -1.0, 0.0,;
20 -1.0, -1.0, 0.0;
21 ];
22 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices),
gl.STATIC_DRAW);
23 squareVertexPositionBuffer.itemSize = 3;
24 squareVertexPositionBuffer.numItems = 4;
25 }.
Tabela 3: Função initBuffers.
A variável triangleVertexPositionBuffer (linha 1) é específica para o triângulo e
squareVertexPositionBuffer (linha 2) é específica para o quadrado. Essas variáveis referem-se
à posição dos vértices do triângulo e quadrado para serem armazenados no buffer.
Na função initBuffers, são definidas as posições dos vértices. Esses vértices estão
distribuídos nos pontos de um triângulo isósceles com seu centro em (0,0,0). Nas linhas 5 e 22
dois objetos do tipo Float32Array são criados, para que a WebGL os utilize para ocupar o
espaço do buffer do triangleVertexPositionBuffer e squareVertexPositionBuffer.
Em initBuffers são definidas duas novas propriedades, o itemSize, nas linhas 3 e
23 e numItens, nas linhas 4 e 24. O numItens representa, no caso do triângulo, três diferentes
posições dos vértices, cada um dos quais é composto por três números (itemSize). O mesmo é
52
feito para o quadrado. O quadrado tem quatro posições de vértices, em vez de três, como no
triângulo, e assim a matriz é maior e o numItems é diferente.
Com a explicação da função initBuffers finalizada, observa-se agora a função
drawScene, na Tabela 4. Na linha 2, o tamanho da tela, com largura e altura, representadas
respectivamente por gl.viewportWidth, gl.viewportHeight, onde ficará localizado o objeto é
definido usando o método gl.viewport. Em seguida, na linha 3, a tela é “limpa” em preparação
para o desenho, através do método gl.clear.
1 function drawScene() {;
2 gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
3 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
4 mat4.perspective(45,gl.viewportWidth/gl.viewportHeight,
0.1,100.0,pMatrix);
5 mat4.identity(mvMatrix);
6 mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]);
7 gl.bindBuffer(gl.ARRAY_BUFFER,triangleVertexPositionBuffer);
8 setMatrixUniforms();
9 gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems).
Tabela 4: Função drawScene.
Continuando, são especificadas as matrizes que proporcionarão como o usuário
irá visualizar a cena. Em mat4.perspective, como mostra a linha 4, é dito que o campo de vi-
são é de 45° e que a cena será visualizada de maneira mais próxima do que 0,1 unidades e
mais distante que 100 unidades.
Seguindo com o código, a linha 6 mostra o comando responsável por apresentar o
triângulo do lado esquerdo da tela. Move-se o triângulo 1,5 unidades para a esquerda, isto é,
no sentido negativo ao longo do eixo X, e sete unidades na cena, isto é, se afasta do
observador, no sentido negativo ao longo do eixo Z.
Os passos para o desenho do quadrado são os mesmos para o triângulo, não
havendo a necessidade de apresentá-los, pois o código completo está presente em Anexo, na
página 69 desta monografia.
Depois de ser apresentado initBuffers e drawScene, nota-se também uma
referência a função initGL em webGLStart, na Tabela 2, já apresentada. Em initGL (Tabela 5),
caso o navegador usado para visualização do objeto que está sendo construído não for
compatível com WebGL, uma mensagem informará que não é possível a inicialização da
WebGL, como mostra a linha 10. Uma vez feito isso, o ambiente da WebGL está configurado
53
e o objeto pronto para ser visualizado no navegador.
1 var gl;
2 function initGL(canvas) {;
3 try {;
4 gl = canvas.getContext("experimentação-webgl");
5 gl.viewportWidth = canvas.width;
6 gl.viewportHeight = canvas.height;
7 } catch (e) {;
8 };
9 if (!gl) {;
10 alert("Não foi possível inicializar WebGL");
11 };
12 }.
Tabela 5: Função initGL.
Na Tabela 6, que apresenta a função initShaders, um método getShader é usado
para obter dois elementos, o fragmentShader e o vertexShader, e depois atribuí-los para
WebGL, esse é representado por gl, apresentados nas linhas 3 e 4, respectivamente. Ainda nas
linhas 3 e 4, são passados os identificadores de fragmentShader e vertexShader, representados
respectivamente por shader-fs e shader-vs.
1 var shaderProgram;
2 function initShaders() {;
3 var fragmentShader = getShader(gl, "shader-fs");
4 var vertexShader = getShader(gl, "shader-vs");
5 shaderProgram = gl.createProgram();
6 gl.attachShader(shaderProgram, vertexShader);
7 gl.attachShader(shaderProgram, fragmentShader);
8 gl.linkProgram(shaderProgram);
9 if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {;
10 alert("Não foi possível inicializar WebGL");
11 };
12 gl.useProgram(shaderProgram);
Tabela 6: Função initShaders.
Os shaderVertex e shaderFragment não são escritos em JavaScript, embora a
ascendência da linguagem seja claramente similar. Na verdade, eles são escritos em uma
54
linguagem de chamada de GLSL17
(OpenGL Shading Language) que é basicamente
linguagem C com outros tipos de dados e funções. Não será necessário entrar em detalhes a
respeito de GLSL, apenas entender o funcionamento dos dois shaders.
O shader-fs, apresentado na Tabela 7 na linha 1, tem estruturado o código
obrigatório relacionado à placa gráfica, está com números de ponto flutuante (linha 3) e
simplesmente especifica que tudo o que é desenhado será em branco (linha 6). O segundo
shader, o shader-vs, é um pouco mais interessante. Associado a ele, há duas variáveis do tipo
uniform que chamam uMVMatrix e uPMatrix, linhas 11 e 12, respectivamente. Variáveis do
tipo uniform são úteis, pois elas podem ser acessadas de fora do shader. Agora, o shader é
chamado para cada vértice, e o vértice é passado para o aVertexPosition (linha 10).
O pequeno pedaço de código void main, na linha 5, apenas multiplica a posição
do uPMatrix com uMVMatrix, e “empurra” para fora o resultado como a posição final do
vértice, mostrado na linha 14. Assim, webGLStart chama initShaders, que usou getShader
para carregar os shaderVertex e shaderFragment de scripts na página Web, de modo que
WebGL renderize a cena.
1 <script id="shader-fs" type="x-shader/x-fragment">;
2 #ifdef GL_ES;
3 precision highp float;
4 #endif;
5 void main(void) {;
6 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
7 };
8 </script>;
9 <script id = "shader-vs" type = "x-shader/x-vertex">;
10 attribute vec3 aVertexPosition;
11 uniform mat4 uMVMatrix;
12 uniform mat4 uPMatrix;
13 void main(void) {;
14 gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
15 };
16 </script>.
Tabela 7: O shader-fs e shader-vs.
17
http:// www.opengl.org/documentation/glsl
55
5.4 Resultados
O exemplo apresentado neste capítulo teve como objetivo explicar funções
necessárias quando se deseja construir um objeto 3D em WebGL. Mesmo o exemplo aqui
apresentado não sendo um objeto 3D, ele apresenta as mesmas funções, essas essenciais e
importantes para se construir algo colorido e com movimento, ou seja, devidamente modelos
tridimensionais com WebGL. Percebe-se a necessidade, antes de tudo de se conhecer
previamente conceitos relacionados a conteúdos gráficos, como renderização, por exemplo. A
Figura 23 mostra o resultado do exemplo aqui apresentado, quando exibido em um navegador
compatível com WebGL. O efeito desejado foi concretizado. O navegador para exibição é o
Mozilla Firefox 4.0 Beta 10, escolhido para os testes e construção das modelagens.
Fig. 23: Resultado exibido executado em um navegador.
No próximo Capítulo são apresentadas práticas de modelagens fazendo uso de um
framework em WebGL, o Three.js, que contempla todas as funções apresentadas até aqui. O
código completo referente aos trechos apresentados anteriormente está presente na página 70,
no Anexo A desta monografia.
56
Capítulo 6
Desenvolvimento de objetos 3D com Three.js
Nesse capítulo é discutido o produto final do trabalho e também os resultados ob-
tidos com sua construção, fazendo uso de um framework em WebGL. No Capítulo 4, foram
listadas algumas das inúmeras engines (também conhecidas como frameworks) destinadas a
facilitar o desenvolvimento de objetos tridimensionais para a web fazendo proveito da tecno-
logia WebGL. Entre esses frameworks, está o Three.js [30], que como os outros, visa facilitar
o desenvolvimento de projetos 3D.
Durante o período de pesquisas, foram surgindo a todo o momento, vários frame-
works em WebGL, cada um com suas particularidades, especialidades e características. Um
em especial me chamou atenção. Trata-se do framework Three.js. Com esse framework con-
segue-se criar com facilidade câmeras, objetos, materiais, cenas de iluminação e muito mais.
Isso tudo podendo optar como a cena será desenhada, escolhendo entre Canvas, WebGL ou
SVG.
A biblioteca completa para download é disponibilizada no site de diretório de ar-
quivos, o Github18
, e contém uma série de exemplos prontos, a fim de mostrarem as grandes
possibilidades de desenvolvimento, que vão desde exemplos simples aos mais avançados.
Quando é feito o download da biblioteca, o usuário se depara com várias pastas e subpastas.
Uma dessas pastas é a pasta examples (veja Figura 24), onde são disponibilizados os exem-
plos criados a partir de plataformas como a WebGL, SVG e propriamente Three.js.
Fig. 24: Pasta examples do Three.js.
18
http://www.github.com/mrdoob/three.js
57
Ainda na biblioteca Three.js são encontradas as plataformas suportadas, como
WebGL, SVG e Three.js distribuídas na pasta build dentro de uma outra pasta, custom. Thre-
e.js fica localizada fora da pasta custom, mas dentro da pasta build, como mostra a Figura 25.
Fig. 25: Pasta custom do Three.js.
Ao iniciar o projeto deve-se escolher, entre as disponíveis na biblioteca Three.js, a
plataforma que será utilizada para a implementação no projeto, pois ela dá suporte a várias,
como SVG e WebGL. Para esta primeira prática de modelagem, escolhe-se o Three.js, que
contempla funções em WebGL, apresentadas no capítulo anterior. Então, neste primeiro traba-
lho, apresenta-se de forma minuciosa, a criação de uma forma simples, uma esfera. Essa esfe-
ra não tem movimentos, apenas é estática.
Antes de tudo, deve-se destacar a escolha do navegador para a exibição da cena
em WebGL. Deve-se escolher um com WebGL habilitada por padrão, ou fazer isso manual-
mente. Para a execução das práticas apresentadas a seguir, foi escolhido o navegador Firefox
4.0 Beta 10, que já vem com WebGL habilitada nativamente.
6.1 Desenvolvimento de uma esfera sem movimento
Neste primeiro projeto, será apresentado um código simples, relacionado ao de-
senvolvimento de uma esfera em Three.js. Para a edição da página em HTML, foi utilizado o
58
editor de texto e códigos fonte Notepad++19
, mas poderia ser feito com qualquer outro simi-
lar, como mostra a Figura 26.
Fig. 26: Notepad++ em execução.
A Tabela 8 apresenta a configuração simples feita de toda a página em HTML, em
que é destacado o local, onde será especificada a plataforma escolhida para o desenvolvimen-
to da esfera, no caso é Three.js, linha 4. Deve-se haver uma ligação obrigatória da biblioteca
Three.js que se deseja trabalhar, com o código para a implementação do projeto.
1 <html>;
2 <head>;
3 <title>Esfera</title>;
4 <script src ="libs/Three.js"> </script>;
5 </head>;
6 <body>;
7 <div id="meuobjeto"></div> ;
8 </script>.
Tabela 8: Primeiras linhas do código em HTML.
Há uma série de exemplos avançados presentes em Three.js, mas para compreen-
der como as funções específicas funcionam, deve-se começar com um projeto simples. Duran-
te o desenvolvimento, esta implementação foi adaptada e simplificada de forma a torná-la
mais compreensível. Inicialmente, a definição e configuração de algumas variáveis devem ser
estabelecidas. Variáveis principais, como esfera e meuobjeto, foram definidas na língua por-
19
http:// notepad-plus-plus.org
59
tuguesa, a fim de tornar mais compreensível as funções quando referenciarem essas variáveis,
e as demais foram referidas na língua inglesa.
1 var esfera;
2 var width = 1000, height = 500;
3 var angle = 45, aspect = width/height, near = 0.1, far = 10000;
4 esfera = document.getElementById("meuobjeto").
Tabela 9: Variáveis globais.
Inicialmente, a definição e configuração de algumas variáveis devem ser estabe-
lecidas, apresentadas na Tabela 9. As variáveis apresentadas, definem a largura (linha 2), altu-
ra (linha 2) e os detalhes da câmera (linha 3) da esfera. Na linha 03, observa-se os parâmetros
passados para representar os detalhes da câmera, near e far, que representam respectivamente
a proximidade e o distanciamento. Bem no início do código HTML (Tabela 8, linha 7), foi
criado um elemento div com o id de meuobjeto, assim, a variável esfera o obtém, através do
comando na linha 4, na Tabela 9.
A Tabela 10 apresenta os códigos relacionados ao processo de renderização, atra-
vés da criação da variável renderer, na linha 1.
1 var renderer = new THREE.WebGLRenderer();
2 var camera = new THREE.Camera(angle, aspect, near, far);
3 var scene = new THREE.Scene();
4 camera.position.z = 200;
5 renderer.setSize(width, height);
6 var material = new THREE.MeshBasicMaterial({color: 0xCC0000}).
Tabela 10: Especificação da renderização e aplicação da cor a esfera.
Em relação à coloração da esfera, precisa-se criar um material para usar com a
forma geométrica. Neste caso será usado o MeshBasicMaterial (linha 6), que vai aplicar uma
cor vermelha plana a esfera.
É comum encontrar exemplos de modelagens 3D na Internet representados como
formas geométricas. E não é por acaso, pois uma forma geométrica reúne elementos
específicos que definem tamanho, largura, centro, raio, vértices, e outros. Para este caso, esses
elementos estão representados por radius, segments e rings, cada um com seus valores
determinados, como mostra a Tabela 11, na linha 1.
60
1 var radius = 50, segments = 16, rings = 16;
2 var mesh = new THREE.Mesh(new THREE.SphereGeometry(radius, segments,
rings), material);
3 meuobjeto.appendChild(renderer.domElement).
Tabela 11: Variáveis geométricas.
A linha 3 da Tabela 11 mostra a vinculação da cena criada ao elemento DOM
(Document Object Model). O DOM essencialmente liga páginas Web a scripts ou linguagens
de programação (Mozilla Developer Network, 2011).
6.2 Resultados
Executado no navegador compatível com WebGL, para este caso foi utilizado o
navegador Firefox, o que se vê é uma simples esfera de cor vermelha. Nada muito avançado,
mas o suficiente para perceber o nível de codificação presente em WebGL aplicado ao
Three.js. O código completo, com referência as funções mais importantes a esta prática de
modelagem, está presente no Anexo B, na página 73.
Fig. 27: Esfera criada a partir da biblioteca Three.js,
visualizada no navegador Firefox.
6.3 Desenvolvimento de um cubo 3D interativo
Para esta segunda prática de modelagem, buscou-se o desenvolvimento de um
cubo 3D, onde se pode interagir com ele através de movimentos com o mouse. Além das
funções já contempladas na última prática de modelagem, esse cubo terá outras funções, como
61
por exemplo, funções relacionadas à animação que irá desencadear os movimento e interação
através do mouse. A Figura 28 apresenta a estrutura do arquivo em forma de diagramas, onde
entre os scripts, são declaradas e armazenadas as funções referentes ao desenvolvimento do
cubo em JavaScript.
Fig. 28: Estrutura do arquivo index.html.
Como mostra a Tabela 12, nas primeiras linhas do código, são especificadas as
funções extras e a biblioteca principal para a criação do cubo 3D. Assim como no
desenvolvimento da esfera, o cubo também será criado com o framework Three.js,
acompanhado de funções extras. Assim como os outros exemplos apresentados, todo o código
é apresentado em Anexo na página 74.
62
1 <html>
2 <head>
3 <title>Cubo</title>
4 <script src="libs/yepnope.1.0.1-min.js"></script>
5 <script src="libs/RequestAnimationFrame.js"></script>
6 <script src="libs/modernizr-1.7.min.js"></script>
7 <script src="libs/Three.js"></script>
8 </head>
Tabela 12: Declaração das funções extras do Three.js.
A declaração das variáveis globais é apresentada na Tabela 13. São declaradas as
variáveis camera, cena, renderer e cubo na linha 1, e outras com valores passados, como
targetRotationX (linha 2) e targetRotationY (linha 3), cujas utilizações serão apresentadas ao
longo deste capítulo.
1 var camera, cena, renderer, cubo;
2 var targetRotationX = 0;
3 var targetRotationY = 0;
4 var targetRotationOnMouseDownX = 0;
5 var targetRotationOnMouseDownY = 0;
6 var mouseX = 0;
7 var mouseY = 0;
8 var mouseXOnMouseDown = 0;
9 var mouseYOnMouseDown = 0;
10 var canvasWidth = 1000;
11 var canvasHeight = 500;
12 var canvasHalfX = canvasWidth / 2;
13 var canvasHalfY = canvasHeight / 2.
Tabela 13: Variáveis globais.
A interação com o cubo será através de movimentos com o mouse. Para isso
acontecer, existem funções específicas e algumas variáveis são passadas antes de tudo. Nesta
modelagem, o diferencial é a possibilidade de interação com o mouse, por isso não será
necessário entrar em detalhes em relação a outras funções, pois as mesmas já foram
apresentadas em capítulos anteriores. As variáveis targetRotationX (linha 2) e targetRotationY
(linha 3) serão respectivamente, os alvos na rotação no eixo X e Y e
63
targetRotationOnMouseDownX (linha 4) e targetRotationOnMouseDownY (linha 5),
respectivamente serão alvos da rotação no eixo X e Y quando o mouse estiver pressionado.
Duas funções principais são declaradas, init (Tabela 14) e animate (Tabela 15).
Dentro da função init serão definidas as propriedades de renderização, câmera e cores. O cubo
é formado por seis faces, e por esta razão, é criado um vetor com seis posições, que
representam as faces do cubo e adiciona cores a essas faces, como mostra a linha 8 da Tabela
14. Foi aplicado um método randômico, onde proporcionará cores diferentes a cada face do
cubo quando este for exibido.
1 function init () {;
2 var container = document.getElementById("meuobjeto");
3 camera = new THREE.Camera(70, canvasWidth / canvasHeight, 1, 1000);
4 camera.position.y = 150;
5 camera.position.z = 500;
6 camera.target.position.y = 150;
7 var arrayCor, materiais = new Array();
8 arrayCor = [Math.random() * 0xffffff0, Math.random() * 0xffffff0,
Math.random() * 0xffffff0, Math.random() * 0xffffff0, Math.random() *
0xffffff0, Math.random() * 0xffffff0];
9 for (var i = 0; i < 6; i++) {;
10 materiais.push( [new THREE.MeshLambertMaterial( { color: arrayCor[i]
} ) ] );
11 };
12 var mesh = new THREE.Cube(300, 300, 300, 1, 1, 1, materiais);
13 cubo = new THREE.Mesh(mesh, new THREE.MeshFaceMaterial() );
14 cubo.position.y = 150;
15 cena = new THREE.Scene();
16 cena.addObject(cubo);
17 renderer = new THREE.CanvasRenderer();
18 renderer.setSize(canvasWidth, canvasHeight);
19 container.appendChild( renderer.domElement );
20 container.addEventListener('mousedown', onMouseDown, false);
21 }.
Tabela 14: Função init.
Uma parte interessante do código relaciona-se aos métodos que levam o usuário a
interagir com o objeto tridimensional através de movimentos com o mouse. Isso é possível
devido a uma lib, ou conjunto de funções, que proporciona esses resultados, a lib
RequestAnimationFrame.js.
64
1 function animate () {;
2 requestAnimationFrame(animate);
3 render();
4 }.
Tabela 15: Função animate.
As funções onMouseDown, onMouseMove, onMouseUp e onMouseOut permitem
a movimentação do cubo em posições diferentes sobre a tela. Na Tabela 16, quando a função
onMouseDown for chamada, ela adicionará os eventos que tornarão false as outras posições, e
só ela será executada, e assim, define as posições de X e Y quando o mouse estiver clicado.
Isso é mostrado nas linhas 3, 4 e 5.
1 function onMouseDown (event) {;
2 event.preventDefault();
3 document.addEventListener('mousemove', onMouseMove, false);
4 document.addEventListener('mouseup', onMouseUp, false);
5 document.addEventListener('mouseout', onMouseOut, false);
6 mouseXOnMouseDown = event.clientX - canvasHalfX;
7 mouseYOnMouseDown = event.clientY - canvasHalfY;
8 targetRotationOnMouseDownX = targetRotationX;
9 targetRotationOnMouseDownY = targetRotationY;
10 }.
Tabela 16: Função onMouseDown.
A função onMouseMove (Tabela 17) é responsável por reconhecer os movimentos
do mouse sobre o cubo. Define-se as posições do mouse no eixo X e Y quando estiver se
movendo, como mostra as linhas 4 e 5, funções targetRotationX e targetRotationY.
1 function onMouseMove (event) {;
2 mouseX = event.clientX - canvasHalfX;
3 mouseY = event.clientY - canvasHalfY;
4 targetRotationX = targetRotationOnMouseDownX + (mouseX -
mouseXOnMouseDown) * 0.02;
5 targetRotationY = targetRotationOnMouseDownY + (mouseY -
mouseYOnMouseDown) * 0.02;
6 }.
Tabela 17: Função onMouseMove.
65
Já em onMouseUp (Tabela 18), serão removidos os eventos quando o mouse não
estiver clicado, através do comando document.removeEventListener, nas linhas 2 e 3.
1 function onMouseUp (event) {;
2 document.removeEventListener('mousemove', onMouseMove, false);
3 document.removeEventListener('mouseup', onMouseUp, false);
4 dmateriaisoveEventListener('mouseout', onMouseOut, false);
5 }.
Tabela 18: Função onMouseUp.
Em onMouseOut (Tabela 19), eventos serão removidos no momento em que o
mouse sair da tela. Assim como na função onMouseUp, o comando que faz a remoção dos
eventos é o document.removeEventListener, mostrados nas linhas 2,3 e 4.
1 function onMouseOut (event) {;
2 document.removeEventListener('mousemove', onMouseMove, false);
3 document.removeEventListener('mouseup', onMouseUp, false);
4 document.removeEventListener('mouseout', onMouseOut, false);
5 }.
Tabela 19: Função onMouseOut.
6.4 Resultados
Para o desenvolvimento do cubo e da esfera, a biblioteca Three.js proporcionou
mais agilidade e desempenho nos resultados. O grau de dificuldade encontrado durante essas
práticas de modelagens foi relacionado à programação em JavaScript e a termos relacionados
a conteúdos gráficos, muito comum, pois WebGL trata-se de sintaxe da OpenGL ES e tudo
isso era algo novo até então. Ainda, durante o desenvolvimento das práticas de modelagens,
foram percebidas as grandes possibilidades em 3D que a WebGL proporciona e isso é
reforçado através dos exemplos já prontos encontrados na biblioteca quando é feito o seu
download. Mesmo estando ainda em fase de desenvolvimento e aliada a frameworks, como o
Three.js, essas possibilidades só aumentam e tornam a WebGL como mais uma opção, ao lado
do Flash, Unity, SVG e Silverlight, aos desenvolvedores. Ao final de tudo, quando executado
em um navegador compatível com WebGL, é exibido um cubo colorido e interativo, cujas
66
cores de suas faces mudam a medida que é executado. Realmente algo em 3D, como é
mostrado na Figura 29.
Fig. 29: Cubo 3D criado a partir da biblioteca Three.js.
67
Capítulo 7
Considerações Finais
Sobre este trabalho, há aspectos que devem ser esclarecidos, que vão desde todo o
processo de pesquisa até o desenvolvimento das pequenas práticas de modelagens. A ausência
de bibliografias específicas levou que grande parte do desenvolvimento desta monografia se
baseasse na pesquisa online. Com um tempo considerado curto, em referência ao período de
criação da monografia, o desejo seria conhecer e explorar outros frameworks, ou mesmo, pes-
quisar ainda mais a respeito das diferentes tecnologias 3D pra Web. Apesar destas limitações,
considera-se que os objetivos iniciais foram gradativamente atingidos.
Hoje, a Web não está como antes, quando havia muitas dificuldades, sobretudo
em termos de acessibilidade, interatividade e usabilidade. E a tecnologia 3D veio pra propor-
cionar esses recursos e muito outros. A consequência disto é que, atualmente, a Web está cada
vez mais acessível e apresenta melhores qualidades, e isso é visível em muitas das áreas da
aplicação 3D, como o comercio eletrônico, jogos pra computador, cinema, televisão, jogos
online, e cresce num ritmo muito acelerado.
Este trabalho descreveu e estudou o uso de WebGL, para a aplicação de objetos
3D na Web. A recente introdução da API WebGL para alavancar o poder de aceleradores grá-
ficos 3D em navegadores Web abre a possibilidade de desenvolver aplicações gráficas avan-
çadas sem a necessidade de um plug-in. Existem vários contextos em que essa nova tecnolo-
gia pode ser explorada para melhorar a experiência do usuário e fruição de dados, como apli-
cações de comércio eletrônico, jogos e a Web. O surgimento do WebGL e os esforços de ou-
tras tecnologias semelhantes, como o Flash, ampliaram os horizontes da tecnologia 3D na
Web. Uma das vantagens do WebGL é por essa tecnologia ser open-source (código aberto), o
que amplia os horizontes de desenvolvimento. Isso pode ser representado pela expressiva pre-
sença de frameworks presentes na Web, alguns já apresentados nesta monografia. Com um
código aberto, os utilizadores proverão de uma tecnologia com maiores possibilidades de cri-
ações, e assim, mais concorrência em se fazer algo inovador e diferente.
O framework Three.js, escolhido para as práticas de modelagens, dá ao desenvol-
vedor as ferramentas necessárias para a produção de conteúdos tridimensionais para visuali-
zação em navegadores. Os conhecimentos adquiridos ao longo desses anos de graduação con-
tribuíram de certa forma, mas não o suficiente para a criação dos objetos WebGL, visto que a
68
mesma exigia conhecimentos em programação para Web e em relação a conteúdos gráficos,
cujos conteúdos não integram a grade curricular do curso. O aprendizado veio com as pesqui-
sas e práticas. Em relação às práticas, os frameworks foram aliados, pois através de seus e-
xemplos, especialmente do Three.js, ficaram mais fáceis a criação de outros, contemplando
assim, a parte prática da monografia. Com exemplos dos mais simples aos mais avançados, o
usuário tem noção do que é a tecnologia 3D para navegadores. Esse framework, juntamente
com os outros, como o SpiderGL e GLGE, só reforçam a importância de se trabalhar com
uma ferramenta de código aberto.
Em resumo, aguarda-se ansiosamente para que futuramente se possa visualizar de
uma forma automática um objeto 3D na Web, sem que haja a necessidade de se instalar no
navegador pequenos programas (plug-ins) em função da ferramenta usada, WebGL, passando
assim a desfrutar cada vez mais desta tecnologia.
69
Anexo A
Código-fonte referente ao Capítulo 5
<html>
<head>
<title>Triângulo e Quadrado</title>
<script type="text/JavaScript" sac = "glMatrix-0.9.5.min.js"></script>
<script id="shader-fs" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
</script>
<script id = "shader-vs" type = "x-shader/x-vertex">
attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
</script>
<script type="text/javascript">
var gl;
function initGL(canvas) {
try {
gl = canvas.getContext("experimentação-webgl");
gl.viewportWidth = canvas.width;
gl.viewportHeight = canvas.height;
} catch (e) { }
if (!gl) {
alert("Não foi possível inicializar WebGL");
}
}
function getShader(gl, id) {
var shaderScript = document.getElementById(id);
if (!shaderScript) {
return null;
}
var str = "";
var k = shaderScript.firstChild;
while (k) {
if (k.nodeType == 3) {
str += k.textContent;
}
k = k.nextSibling;
}
var shader;
if (shaderScript.type == "x-shader/x-fragment") {
shader = gl.createShader(gl.FRAGMENT_SHADER);
} else if (shaderScript.type == "x-shader/x-vertex") {
shader = gl.createShader(gl.VERTEX_SHADER);
70
} else {
return null;
}
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
var shaderProgram;
function initShaders() {
var fragmentShader = getShader(gl, "shader-fs");
var vertexShader = getShader(gl, "shader-vs");
shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Não foi possível inicializar shaders");
} gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute =
gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram,
"uPMatrix");
shaderProgram.mvMatrixUniform =
gl.getUniformLocation(shaderProgram, "uMVMatrix");
}
var mvMatrix = mat4.create();
var pMatrix = mat4.create();
function setMatrixUniforms() {
gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false,
mvMatrix);
}
var triangleVertexPositionBuffer;
var squareVertexPositionBuffer;
function initBuffers() {
triangleVertexPositionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
var vertices = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices),
gl.STATIC_DRAW);
triangleVertexPositionBuffer.itemSize = 3;
triangleVertexPositionBuffer.numItems = 3;
squareVertexPositionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
vertices = [ 1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0
];
71
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices),
gl.STATIC_DRAW);
squareVertexPositionBuffer.itemSize = 3;
squareVertexPositionBuffer.numItems = 4;
}
function drawScene() {
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1,
100.0, pMatrix);
mat4.identity(mvMatrix);
mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]);
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLES, 0,
triangleVertexPositionBuffer.numItems);
mat4.translate(mvMatrix, [3.0, 0.0, 0.0]); gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLE_STRIP, 0,
squareVertexPositionBuffer.numItems);
}
function webGLStart() {
var canvas = document.getElementById("trianguloquadrado");
initGL(canvas);
initShaders();
initBuffers();
gl.clearColor(0.0, 0.0, 0.0, 3.0);
gl.enable(gl.DEPTH_TEST);
drawScene();
}
</script>
</head>
<body onload="webGLStart();">
<canvas id = "trianguloquadrado" width="500" height="500">
</canvas><br/>
</body>
</html>
72
Anexo B
Código-fonte referente ao Capítulo 6
<html>
<head>
<title>Esfera</title>
<script src = "libs/Three.js"> </script>
</head>
<body>
<div id="meuobjeto"></div>
<script>
var esfera;
var width = 1000, height = 500;
var angle = 45, aspect = width/height, near = 0.1, far = 10000;
esfera = document.getElementById("meuobjeto"); var renderer = new THREE.WebGLRenderer(); var camera = new THREE.Camera(angle, aspect, near, far); var scene = new THREE.Scene();
camera.position.z = 200;
renderer.setSize(width,height);
var material = new THREE.MeshBasicMaterial({color: 0xCC0000});
var radius = 50, segments = 16, rings = 16;
var mesh = new THREE.Mesh( new THREE.SphereGeometry( radius,
segments, rings ), material );
scene.addChild(mesh);
meuobjeto.appendChild(renderer.domElement);
var pointLight = new THREE.PointLight( 0xFFFFFF );
pointLight.position.x = 50;
pointLight.position.y = 50;
pointLight.position.z = 130;
scene.addLight(pointLight);
renderer.render(scene, camera);
</script>
</body>
</html>
73
Anexo C
Código-fonte referente ao Capítulo 6
<html>
<head>
<title>Cubo 3D</title>
<script src="js/libs/modernizr-1.7.min.js"></script>
</head>
<script type="text/javascript">
var mouseX = 0;
var mouseY = 0;
var mouseXOnMouseDown = 0;
var mouseYOnMouseDown = 0;
var canvasWidth = 1000;
var canvasHeight = 500;
var canvasHalfX = canvasWidth / 2;
var canvasHalfY = canvasHeight / 2;
init();
animate();
function init () {
var container = document.getElementById("canvas-container");
// criar a camera e define seu posicionamento camera = new THREE.Camera(70, canvasWidth / canvasHeight, 1, 1000); camera.position.y = 150;
camera.position.z = 500;
camera.target.position.y = 150; // armazena as cores das faces
var arrayCor, materiais = new Array();
arrayCor = [0x1089BC, 0x1089BC, 0xc8e3f5, 0xc8e3f5, 0xF14A29,
0xF14A29];
// aplica as cores em cada uma das faces
for (var i = 0; i < 6; i++) { materiais.push( [new THREE.MeshLambertMaterial( { color:
arrayCor[i] } ) ] );
} // mesh é um grafo tridimensional
var mesh = new THREE.Cube(300, 300, 300, 1, 1, 1, materiais); // cria o cubo e seta os materiais relativos a ele cubo = new THREE.Mesh(mesh, new THREE.MeshFaceMaterial() ); cubo.position.y = 150; // cria a cena e adiciona o cubo nela
cena = new THREE.Scene(); cena.addObject(cubo);
// cria o renderizador renderer = new THREE.CanvasRenderer();
renderer.setSize(canvasWidth, canvasHeight); container.appendChild( renderer.domElement ); // adiciona-se os eventos no container container.addEventListener('mousedown', onMouseDown, false); }
function onMouseDown (event) {
event.preventDefault();
// adiciona os eventos
74
document.addEventListener('mousemove', onMouseMove, false);
document.addEventListener('mouseup', onMouseUp, false); document.addEventListener('mouseout', onMouseOut, false);
// posicao do mouse no eixo X e Y quando o mouse estiver clicado mouseXOnMouseDown = event.clientX - canvasHalfX; mouseYOnMouseDown = event.clientY - canvasHalfY;
targetRotationOnMouseDownX = targetRotationX;
targetRotationOnMouseDownY = targetRotationY;
}
function onMouseMove (event) {
// posicao do mouse no eixo X e Y quando o mouse estiver movendo mouseX = event.clientX - canvasHalfX; mouseY = event.clientY - canvasHalfY;
targetRotationX = targetRotationOnMouseDownX + (mouseX -
mouseXOnMouseDown) * 0.02;
targetRotationY = targetRotationOnMouseDownY + (mouseY -
mouseYOnMouseDown) * 0.02;
}
function onMouseUp (event) {
// removendo os eventos quando o mouse nao estiver clicado document.removeEventListener('mousemove', onMouseMove, false); document.removeEventListener('mouseup', onMouseUp, false);
dmateriaisoveEventListener('mouseout', onMouseOut, false);
}
function onMouseOut (event) {
// removendo os eventos quando o mouse deixar a tela document.removeEventListener('mousemove', onMouseMove, false); document.removeEventListener('mouseup', onMouseUp, false);
document.removeEventListener('mouseout', onMouseOut, false);
}
function animate () {
requestAnimationFrame(animate);
render();
}
function render () {
cubo.rotation.y += (targetRotationX - cubo.rotation.y) * 0.05;
cubo.rotation.x += (targetRotationY - cubo.rotation.x) * 0.05;
renderer.render(cena, camera); }
</script>
<body>
<script type="text/javascript" src="js/yepnope.1.0.1 min.js">
</script>
<script>
yepnope({
test: Modernizr.canvas,
yep: ['build/Three.js', 'js/RequestAnimationFrame.js'],
nope: 'css/canvas-polyfill.css'
});
</script> </body>
</html>
75
Referências
[01] Ambiera. Disponível em: <http://www.ambiera.com>. Acesso em: 16 ago 2011.
[02] Ancorador. Disponível em: <http://www.ancorador.com.br/jogos/a-evolucao-dos-jogos-
3d-online>. Acesso em: 05 out 2011.
[03] CONCI, A; AZEVEDO, E. Computação Gráfica: Geração de Imagens. Rio de Janeiro:
Campus, 2003.
[04] Criar Web. Disponível em: <http://www.criarweb.com/artigos/282.php>. Acesso em: 07
out 2011.
[05] C3DL. Disponível em: <http://www.c3dl.org>. Acesso em: 14 ago 2011.
[06] DevMedia. Disponível em: <http://www.devmedia.com.br/post-19773-Entendendo-e-
usando-o-SVG.html>. Acesso em: 09 out 2011.
[07] DevTuts. Disponível em: <http://devtuts.com.br/wp/2010/06/introducao-a-engine-unity-
3d-o-que-e-o-que-posso-fazer-vantagens-e-muito-mais>. Acesso em: 09 out 2011.
[08] FOSSE, J. M. (2004). Representação cartográfica interativa tridimensional: Estudo da
variável visual cor em ambiente VRML. Curitiba: Universidade Federal do Paraná, 2004.
[09] GARROTT, J., & Ferreira, A. Programação na World Wide Web com CGIs (2ª ed.). Lis-
boa: FCA, 2002.
[10] Globo. Disponível em: <http://g1.globo.com/tecnologia/noticia/2011/06/saiba-mais-
sobre-os-principais-navegadores-de-internet.html>. Acesso em: 19 ago 2011.
[11] GLGE. Disponível em: <http://www.glge.org>. Acesso em: 14 ago 2011.
[12] G1. Disponível em <http://g1.globo.com/tecnologia/noticia/2011/01/numero-de-usuarios-
de-internet-no-mundo-alcanca-os-2-bilhoes.html>. Acesso em: 11 nov 2011.
[13] Hardware. Disponível em: <http://www.hardware.com.br/artigos/mundo-jogos3d>.
Acesso em: 05 out 2011.
[14] ICMP - USP. Disponível em: <http://www.icmc.usp.br/ensino/material/html/www.html>.
Acesso em: 05 out 2011.
[15] IDG NOW. Disponível em: <http://idgnow.uol.com.br/seguranca/2011/05/09/falha-grave-
de-seguranca-atinge-chrome-e-firefox-4>. Acesso em: 17 ago 2011.
[16] Info. Disponível em: <http://info.abril.com.br/noticias/internet/silverlight-3-entregara-
videos-com-qualidade-10072009-8.shl>. Acesso em: 14 nov 2011.
[17] ITU – International Telecomunication Union. Disponível em
<http://www.itu.int/en/osg/Pages/biography.aspx>. Acesso em: 11 nov 2011.
76
[18] Learning WebGL. Disponível em: <http://www.learningwebgl.com>. Acesso em: 16 ago
2011.
[19] Macromedia. Disponível em:
<http://www.macromedia.com/support/documentation/br/flashplayer/help/help10.html>.
Acesso em: 10 out 2011.
[20] Microsoft Silverlight. Disponível em: <http://www.silverlight.net>. Acesso em: 07 set
2011.
[21] Net Security. Disponível em: <http://www.net-security.org/article.php?id=1601>. Acesso
em: 16 ago 2011.
[22] No mundo do cinema. Disponível em:
<http://nomundodocinema.blogspot.com/2010/04/historia-do-3d.html>. Acesso em: 06 out
2011.
[23] OpenGL ES Overview. Disponível em: <http://www.khronos.org/opengles>. Acesso em:
06 ago 2011.
[24] SILVA, S. Maurício. HTML 5: A linguagem de marcação que revolucionou a web. São
Paulo: Novatec, 2011.
[25] SpiderGL. Disponível em: <http://www.spidergl.org>. Acesso em: 17 ago 2011.
[26] Stat Counter. Disponível em: <http://www.gs.statcounter.com>. Acesso em: 11 nov 2011.
[27] TecMundo. Disponível em: <http://www.tecmundo.com.br/1421-o-que-e-frame-
buffer.htm>. Acesso em: 07 out 2011.
[28] TecMundo. Disponível em: <http://www.tecmundo.com.br/2469-como-funciona-a-
tecnologia 3d-.htm#ixzz1aC5eb7II>. Acesso em: 09 out 2011.
[29] The Khronos Group: Open Standards for Media Authoring and Acceleration. Disponível
em: <http://www.khronos.org> Acesso em: 02 ago 2011.
[30] Three.js . Disponível em: <http://www.threejs.org>. Acesso em: 17 ago 2011.
[31] Ultravisual. Disponível em: <http://www.ultravisual.co.uk/blog/2011/03/31/three-js-and-
webgl>. Acesso em: 11 set 2011.
[32] Unity3D. Disponível em: <http://www.unity3d.com>. Acesso em: 16 ago 2011.
[33] Vale um post. Disponível em: <http://valeumpost.com.br/opera-12-webgl.html>. Acesso
em: 16 out 2011.
[34] WebGL: OpenGL ES 2.0 for the Web. Disponível em: <http://www.khronos.org/webgl>.
Acesso em: 09 ago 2011.
77
[35] WebGL: A new dimension for browser exploitation. Disponível em: <http://www.net-
security.org/article.php?id=1601>. Acesso em: 09 set 2011.
[36] Win Ajuda. Disponível em: <http://www.winajuda.com/noticias/microsoft-webgl-
inseguro-internet-explorer.html>. Acesso em: 16 ago 2011.
[37] 20 lições que aprendi sobre navegadores e a web. Disponível em:
<http://www.20thingsilearned.com>. Acesso em: 13 ago 2011.