Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
0301670, 8° Semestre
Jaguariúna
2006
Eder Miranda Ferreira Leite
0301670, 8° Semestre
Jaguariúna
2006
LEITE, Eder Miranda Ferreira. Construção de Framework para Suporte de Animações
"Newtonianas" Usando Mecânica Clássica. Monografia defendida e aprovada na Faculdade de
Jaguariúna em 11 de dezembro de 2006 para banca examinadora constituída pelos professores:
.
Prof. Ms. Peter Jandl Jr.
FAJ - Orientador
.
Prof. Ricardo Menezes Salgado
FAJ - Convidado
.
Prof. Ademário Araújo Jr.
FAJ - Convidado
DEDICATÓRIA
Dedico esse trabalho a todas as pessoas humildes como eu, que com muita garra e luta,
conseguiram chegar até aqui.
AGRADECIMENTOS
Ao prof. Peter Jandl Jr. pela orientação dedicada e pelo estímulo dado a mim em todas
as fases de realização deste trabalho.
Aos meus amigos Rogério, Gustavo, Cléia, Rose, Danilo e Carlão pelo apoio, pela ajuda
no levantamento de material e pelas discussões críticas que, em muito enriqueceram a
realização deste trabalho.
Aos meus pais, Antônio e Rita e irmãs, Adriana e Juliana pelo apoio nas longas noites
em claro.
Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca
se arrepende.
(Leonardo da Vinci)
LEITE, Eder Miranda Ferreira. Construção de Framework para Suporte de Animações
"Newtonianas" Usando Mecânica Clássica. 2006. Monografia (Bacharelado em Ciência da
Computação) – Curso de Ciência da Computação da Faculdade de Jaguariúna, Jaguariúna.
RESUMO
Hoje em dia, estamos o tempo todo cercado pela computação gráfica, seja ela voltada ao
entretenimento (jogos eletrônicos), educação ou publicidade e propaganda (comercias,
banners, etc...), tornou-se uma grande sensação para os profissionais de várias áreas. Porém
esse primeiro associado à tecnologia teve grande aumento qualitativo nas últimas décadas.
Um bom exemplo disso são os aparelhos celulares, que dispõe de vários recursos como jogos
2Ds e 3Ds, vídeos e fotos. Jogos que antigamente eram chamados de passa-tempo, hoje não
são mais conhecidos assim.
Por outro lado, o aumento da qualidade dos jogos implica consideravelmente no realismo dos
mesmos. Isso acabou unindo duas áreas até então distintas a computação gráfica e a física de
movimentos. Este trabalho visa apresentar um demo de framework Java que trate alguns
aspectos dessas duas áreas.
Por fim, todo framework será detalhado, desde o seu projeto até sua implementação, passando
pelas classes auxiliares que facilitam a vida do desenvolvedor.
Palavras Chave:
Computação Gráfica, Java, Java 3D, Jogos Eletrônicos, Física, Mecânica Clássica.
LEITE, Eder Miranda Ferreira. Construção de Framework para Suporte de Animações
"Newtonianas" Usando Mecânica Clássica. 2006. Monografia (Bacharelado em Ciência da
Computação) – Curso de Ciência da Computação da Faculdade de Jaguariúna, Jaguariúna.
ABSTRACT
Nowadays, we are the time all surrounded by the graphical computation, been it directed to
the entertainment (electronic games), education or advertising and spreading (TV ads,
banners, etc…), it had become a great sensation for professionals among several areas.
However the first one, associated to the technology, had a great qualitative increase in the last
few decades. The cellular devices are a great example of it, because they make use of several
resources, such as 2D and 3D games, videos and photos. Games which were called by pastime
in the past actually are not known by that.
On the other hand, the games quality increasing implies considerably in their realism.
Provided by that two areas, distinct from graphical computation and from the movement
physics, were joined.
This work aims at to present a demon of framework Java that deals with some aspects these
areas. A base of knowledge related to the physics of movements, more clearly will be
presented the classic mechanics. Beyond presenting the Java technology (Java SE) and its
tool for development 3D, the API Java 3D, in which the framework was total based.
Finally, all framework will be detailed, since its project until its implementation, passing for
the classrooms auxiliary that facilitate the life of the programmer.
Key Words:
Graphical Computation, Java, Java 3D, Electronic Games, Physics, Classic Mechanics.
SUMÁRIO
1. INTRODUÇÃO................................................................................................................16
1.1. Computação Gráfica ......................................................................................................19
1.2. Problemas, Solução e Apresentação..............................................................................19
6. RESULTADOS OBTIDOS..............................................................................................66
6.1. Comparativo de código entre do framework e da API Java 3D ....................................67
6.1.1. Aplicação usando API Java 3D ..................................................................................67
6.1.2. Aplicação usando o framework ..................................................................................72
6.2. Documentação do framework........................................................................................75
7. CONCLUSÃO..................................................................................................................79
ANEXO I..............................................................................................................................82
Diagrama de Caso de Uso ....................................................................................................82
Diagrama de Classes.............................................................................................................84
Diagrama de Seqüência ........................................................................................................86
ANEXO II ............................................................................................................................87
A classe JD3Browser............................................................................................................87
J3DBrowser ( ) .....................................................................................................................88
adicionarAmbiente ( Ambiente ) ..........................................................................................88
setTitulo ( String ) ................................................................................................................88
A Classe MouseRotateY.......................................................................................................89
A Classe Cores .....................................................................................................................89
getAparenciaPadrao ( ) .........................................................................................................90
setAparencia ( Color3f ) .......................................................................................................90
setAparencia ( Componet, String ) .......................................................................................90
LISTA DE FIGURAS
1. INTRODUÇÃO
Hoje em dia é fácil notar o grande avanço na área de informática. Quem atua nesta
área sabe que, tecnologia de ponta hoje, poucos dias depois não será mais. É muito fácil
encontrar “supercomputadores” na rua (em qualquer lugar), um simples celular, aparelhos
mais comuns do século XXI, tem muito mais funcionalidades de que muitos computadores
em atividade. Comparando computadores do “ponta” de século passado, com os celulares
de hoje em dia, muitos desses computadores perderam em recursos para o celular.
Outro fator fácil de notar é o tamanho desses dispositivos, cada vez mais os
dispositivos com celulares, PDAs e até computadores pessoal, tornam-se menores, mas
mantém ou aumentam seus recursos como capacidade de memória, armazenamento de dados
e processamento de tarefas.
Essa evolução gráfica também é muito fácil de acompanhar nos jogos eletrônicos. Jogos
como os velhos clássicos do Atari 26001, como Enduro, Pitfall e River Raid se comparados
graficamente com jogos atuais como Need for Speed, Prince of Percia ou Fligth Simulator,
certamente ficará fácil notar a grande evolução da computação gráfica (ver Figura 1).
1
“Atari 2600, foi um vídeo game projetado por Nolan Bushnell e lançado em 1978 nos Estados Unidos e em 1983 no
Brasil. Considerado um símbolo cultural dos anos 80, foi um fenômeno de vendas no Brasil entre os anos de 1984 a
1986 e seus jogos permanecem na memória de muitos que viveram a juventude nesta época“ (WIKIPÉDIA, 2006a).
17
É exatamente nesse pilar que o trabalho se sustenta: computação gráfica. Esse trabalho
tratará o desenvolvimento de um framework para suporte de animações 3D, usando alguns
movimentos da mecânica clássica, tendo como objetivo, auxiliar futuros desenvolvedores
a criarem animações 3D, área que atualmente não existe nenhuma ferramenta gratuita,
diminuindo o tempo gasto para a criação das mesmas, podendo ainda ser usado no
desenvolvimento de jogos eletrônicos, além de facilitar o aprendizado da tecnologia Java 3D
em ambiente educacional.
Como dito, esse trabalho demonstrará o estudo dos movimentos de mecânica clássica
da física, tais como MRU (movimento retilíneo uniforme) e MRUV (movimento retilíneo
uniformemente variado).
edição de código, usou-se a IDE de desenvolvimento NetBeans que também pode ser
encontrado em SUN (2006a).
Em seguida, será apresentada uma breve introdução sobre a linguagem Java e sua
importância no desenvolvimento desse projeto. Além disso, serão apresentadas as
funcionalidades básicas da API Java 3D, mostrando suas principais classes e conceitos para
criação de um mundo virtual.
E por fim, será apresentada a solução proposta, comentando cada uma das classes do
framework, formas de uso dessas classes e seus métodos. Além de comparar o código fonte
de uma aplicação que usa apenas o Java 3D puro e outra usando o Java 3D com o framework.
19
“Em 1950, início da computação gráfica, pela primeira vez, um tubo de raios
catódicos é ligado à um computador, on MIT e projeto Sage, onde um radar
foi ligado à um computador, num projeto do exército americano, utilizando
interação com Light Pen”...
“Em 1959, surge o termo computer graphics - criado por Verne L. Hudson,
quando o mesmo coordenava um projeto para a Boeing de simulação
de fatores humanos em aviões”...
“Em 1962, no MIT o projeto TX2 com o aluno Ivan Sutherland usa um
computador para fazer desenhos em sua tese de doutorado”...
Hoje em dia é fato que, a computação gráfica faz parte de vida e muitas pessoas, pois
está presente em vários lugares como filmes, jogos eletrônicos, e até câmeras digitais
e celulares. Mas nesse trabalho será apresentada como uma forma de entretenimento, além de
discutir a importância deste em ambiente educacional.
Esses são simples exemplos de realidade em jogos eletrônicos, e com certeza, esses
movimentos não são tão simples assim de reproduzi-los, será necessário uma boa base de
conhecimento da física mecânica, além disso, é bem complexa a implementação desses
cálculos nessas animações.
Existem sim, alguns bons motores2 para construção de jogos realistas, mas os
desenvolvedores de jogos deparam com dois problemas. Em primeiro lugar, a maioria desses
motores são mono plataformas, ou seja, rodam apenas em um sistema operacional, ou em
apenas um tipo de dispositivo, com isso, seu jogos, acabam ficando presos a um único sistema
operacional. O segundo problema é, por serem proprietários, os desenvolvedores são
obrigados a pagar um alto preço para licenciar essas ferramentas. Isso acaba inviabilizando
o uso principalmente na área educacional.
A proposta desse trabalho é justamente tentar sanar esses dois problemas, criando uma
ferramenta de fácil uso, com portabilidade a vários sistemas operacionais, além de ser livre de
ônus financeiros para o desenvolvedor, ou seja, software livre e de código aberto.
2
“Um motor pode ser definido como um conjunto de funcionalidades reutilizáveis em alto nível que ajudam o
programador a implementar as tarefas mais comuns de um jogo. Para o exemplo, para jogos 2D, devem
possuir recursos de desenho que permitam a manipulação de camandas (layers), imagens (tiles) e animações
(sprites)”.(MALFATTI, 2004).
21
Seria difícil imaginar um mundo onde nada se movimentasse, por isso é tão importante
o estudo do movimento. "Na Física, o movimento é a variação de posição espacial de um
objeto ou ponto material no decorrer do tempo” (WIKIPÉDIA, 2006b).
A ciência física que estuda o movimento é a mecânica. Ela se preocupa tanto com o
movimento em si, quanto com aquilo que o faz existir, inexistir ou cessar. Se abstraírem as
causas do movimento e preocupar-se apenas com a descrição do movimento, ter-se-á estudos
de uma parte da mecânica chamada cinemática.
• Movimento retilíneo;
• Velocidade;
• Aceleração;
• Queda livre;
• Colisão e impulsão;
• Atrito;
1s 1s
Vale lembrar que uma vez que não se produz aceleração sobre qualquer objeto ou ponto
material em MRU a resultante das forças aplicadas é nula, sendo assim, sua velocidade
em qualquer instante é igual à velocidade média. A Equação 1 é responsável por esse calculo.
V = Vi = Vm = ∆S / ∆t
EQUAÇÃO 1: Movimento Retilíneo Uniforme
∆v
a= = cte(≠ 0)
∆t
EQUAÇÃO 2: Aceleração.
EQUAÇÃO 3: Velocidade.
2.2. Velocidade
Como visto a velocidade instantânea varia o tempo todo. Em uma pista, a velocidade
é pequena nas curvas e nas subidas, mas nas descidas e nas estradas em boas condições,
a velocidade instantânea é maior, para calcular a velocidade média, não há necessidade de
saber a velocidade que o velocímetro marcou em cada instante durante a viagem, precisa-se
conhecer somente à distância percorridas e o tempo total da viagem.
Se um carro, em uma viagem, percorre uma distância de 420 km em 6,0 h, ele andaria
em média 70 km/h. Este resultado foi obtido dividindo-se a distância percorrida pelo tempo de
viagem, que é denominado velocidade.
24
2.3. Aceleração
0m 0s
15m 1s
25m 2s
35m 3s
a=
∆v
=
v −v
f i
∆t t −t
f i
medidas feitas ao nível médio dos mares. Em primeira aproximação adota-se para o g o valor
2
de 9,80 / s em qualquer local.
2.5. Colisão
Segundo CHAVES (2001), “a colisão é uma interação entre dois ou mais corpos, com
duração limitada. O choque entre duas bolas de sinuca é, portanto, uma colisão. As bolas
se aproximam uma da outra, interagem fortemente entre si durante o choque e em seguida se
afastam”. O importante aqui é o contato entre dois corpos, e que possa definir um antes e um depois.
“Impulso é a grandeza que descreve o que ocorre quando uma forma é aplicada sobre
um objeto em um intervalo de tempo ∆t .” A relação de impulso e colisão, é definida quando
duas bolas se chocam, exercendo uma força sobre a outra. Isso provoca uma variação do
estado de movimento, nas duas bolas, ou seja, quando um impulso é dado a uma bola, uma
força é exercida sobre ela, alterando sua velocidade, isto é, alterando sua quantidade de
movimento. Nesse caso as duas bolas tem seu estado de movimento alterado, pois, pela
terceira lei de Newton, quando um objeto exerce força sobre outro, este também exerce uma
força sobre o primeiro (CHAVES, 2001).
instante final t f
(após a colisão), obtém-se a Equação 5:
p f d p = p f F (t )dt
∫p ∫p
i i
3
Segunda lei de Newton ou princípio fundamental da dinâmica: “A resultante das forças que agem num
corpo é igual ao produto de sua massa pela aceleração adquirida” (WIKIPÉDIA, 2006c).
27
p − p =∆p = J
f i
Quando solta-se uma superbola sobre um chão áspero, ela perde muito pouco
de sua energia cinética5 com o impacto, retrocedendo essencialmente á sua
altura original; no entanto, se soltar uma bola de golfe, ela perderá parte de sua
energia cinética e retrocederá a 60% de sua altura original. Contudo, se você
largar uma bola feita de massa de vidraceiro no chão, ela perderá toda a sua
energia cinética e não retrocederá de modo algum. Embora o momento linear
seja conservado em todas as colisões, a energia cinética nem sempre
é conservada.
4
A impulsão e a quantidade de movimento linear são ambas grandezas vetoriais e possuem as mesmas
unidades e dimensões.
5
Em física, a energia cinética é a quantidade de trabalho que teve que ser realizado sobre um objeto para
tirá-lo do repouso e coloca-lo a uma velocidade V. Sua formala é dada por: K = ½mv2.
28
Pode-se dizer que em uma colisão elástica, a energia cinética de cada corpo que colide
pode variar, mas a energia cinética total do sistema não pode variar. Considerando um corpo
de massa m1
e velocidade inicial v1i
que se move em direção a um corpo de massa m , que
2
2 m1
v = v
2f
m +m
1 2
1i
EQUAÇÃO 7: Colisão.
2.6. Atrito
Em física, o atrito é uma força natural que atua apenas quando um objeto está
em movimento em contato com outro, e sempre para lhe diminuir o
movimento. Esta força é causada pelo contato dos dois corpos ou meio em que
se move o corpo em movimento, neste caso especial, designado por
viscosidade. O atrito com uma superfície depende da pressão entre o objeto e a
superfície, quanto maior for a pressão maior será o atrito. Passar um dedo pelo
tampo de uma mesa pode ser usado como exemplo prático: se pressionar com
força o dedo, o atrito aumenta e o dedo pára.
Pode parecer estranho afirmar que nenhuma força é preciso para manter um corpo em
movimento quando um avião a jato se desloca a uma velocidade constante utilizando os seus
poderosos motores. A razão é que a força dos motores que impelem o avião para frente
é igualada pelo atrito com o ar através do qual o avião se movimenta, as duas forças
equilibram-se de tal modo que nenhuma atua sobre o avião e ele, portanto continua a mover-
se com uma velocidade constante. Se aumentar o poder dos motores o avião mover-se mais
rapidamente, até que o atrito aumente de modo a corresponder à força desejada, movendo-se
então, a uma maior mas constante velocidade. Sua equação é dada por V = v0 + ad 2 .
29
3. API JAVA 3D
“A API Java 3D consiste em uma hierarquia de classes Java que serve como interface
para o desenvolvimento de sistemas gráficos tridimensionais”. Possui construtores de alto
nível que permitem a criação e manipulação de objetos geométricos, especificados em um
universo virtual. As cenas são representadas através de grafos, e os detalhes de sua
visualização são gerenciados automaticamente. Assim, o desenvolvimento de um programa
Java 3D se resume na criação de objetos e no seu posicionamento em um grafo de cena.
(MANSSOUR, 2003).
Java 3D foi construída com o objetivo de criar uma API que fosse independente de
plataforma, semelhante a VRML. Em colaboração, Intel, Silicon Graphics, Apple e Sun
Microsystems, definiram a especificação Java 3D. Em 1998, a Sun disponibilizou sua
implementação para download. O Java 3D, é uma API baseada nas bibliotecas gráficas
OpenGL e DirectX, e os programas podem ser escritos como aplicação, applet, ou ambas.
3.2. Instalação
Todo software necessário para trabalhar com Java 3D é gratuito e pode ser encontrado
no site da SUN (2006a). A primeira etapa consiste em instalar o Java SE, versão 1.5 ou
posterior. Num segundo momento, deve-se instalar a API Java 3D. Como Java 3D é baseada
nas bibliotecas OpenGL ou DirectX, estas também devem estar instaladas. (ver Figura 4).
APLICAÇÃO / APPLETS
JAVA / JAVA 3D
OPEN GL DIRECT X
HARDWARE
FIGURA 4: Camada de software existente quando se utiliza Java 3D.
Para criar e manipular objetos geométricos 3D, os programadores trabalham apenas com
construtores de alto nível, pois os detalhes para a geração das imagens são gerenciados
automaticamente. Os objetos 3D, juntamente com luzes, som e outros elementos, estão em um
universo virtual. Este universo é composto por um ou mais grafos de cena, que consistem
na organização dos objetos em uma estrutura do tipo árvore.
Um grafo de cena é criado a partir de instâncias de classes Java 3D que definem som,
luz, orientação, geometria, localização e aparência visual dos objetos. Estes objetos
correspondem aos nodos (ou vértices), e os seus relacionamentos são identificados por arcos
(ou arestas) que representam dois tipos de relacionamentos:
31
A seguir passo a passo de forma simplificada para criação de um programa Java 3D:
3.3.2.1. SimpleUniverse
Essa classe é uma das classes mais importantes da API Java 3D, pois é responsável pela
configuração das informações mínimas criando um universo para execução de um programa
Java 3D. Fornece as funcionalidades necessárias para a maioria das aplicações. Quando um
SimpleUniverse é instanciado, cria-se automaticamente todos os objetos necessários para
o subgrafo de visualização, tais como Locale, ViewingPlatform e Viewer. A Listagem 1
mostra um exemplo de instanciação do objeto SimpleUniverse.
1. //declara e simpleUniverse
2. SimpleUniverse u = universo = new SimpleUniverse(canvas);
Instância do SimpleUniverse.
3.3.2.2. GraphicsConfiguration
3.3.2.3. Canvas3D
Essa classe fornece um canvas, ou seja, uma área de desenho, onde é realizada
a visualização 3D. Nesse componente, é realizada a renderização de uma cena 3D, sempre
é instanciado conforme a configuração do dispositivo gráfico em uso. Além disso, ele pode
33
3.3.2.4. BranchGroup
1. //cria transformação
2. Transforme3D t1 = new Transforme3D();
3. t1.rotY(Math.PI/4); // rotação de 45° em y
Instância do Transform3D.
34
3.3.3. Geometrias
Conforme MANSSOUR (2003), “em computação gráfica, modelos são utilizados para
representar entidades físicas ou abstratas e fenômenos no computador. Portanto, a etapa de
modelagem consiste em todo o processo de descrever um modelo, objeto ou cena, de forma
que se possa desenhá-lo.”
A API Java 3D possui diversas formas para criação de geometrias. Como dito
anteriormente, para que os objetos criados sejam visíveis, é necessárias basicamente duas
coisas, a aparência ou material, e uma fonte de luz cuja região de influência inclua os objetos.
3.3.4. Aparências
As classes que determinam as primitivas gráficas não especificam cor, pois sua
aparência é determinada através do nodo Appearance. Se esse nodo não for instanciado,
a geometria é desenhada com a cor branca, sem a possibilidade de determinar suas
propriedades, tais como textura, transparência, cor, estilo de linha e material. Os métodos
principais para obtenção dessas propriedades são:
4.1. Avaliação
A linguagem Java, conta com diversos tipos de framework, cada um tem sua própria
importância e usabilidade. Sendo assim, para ter uma devida avaliação das funcionalidades
mínimas, foi interessante analisar dois pontos:
4.1.1. Ambiente
• GraphicsConfiguration;
• BranchGroup;
• SimpleUniverse;
• Canvas3D;
• AmbientLight (Luz de ambiente);
• DirectionalLight (Luz de capacete);
• Capacidade de interação;
• Chão (Base fixa para criação da animação).
Além dessas, a ela fornece alguns métodos para a personalização do ambiente virtual,
no capítulo seguinte será detalhado o uso de cada um dos métodos dessa classe. A seguir
alguns exemplos desses métodos:
4.1.2. Gatilho
O objeto Gatilho é bem simples e poderá ser adicionado à uma janela (JFrame). No
Anexo 2, há uma introdução para uso do visualizador J3DBrowser. Usando esse visualizador,
o usuário ficará isento de criar uma interface para visualização do ambiente virtual, pois ele
dá suporte para adicionar um Canvas3D, além de ser baseado em um JFrame, dando
a possibilidade de adicionar o objeto Gatilho à ele.
4.1.3. Temporizador
A classe Temporizador estende a classe Alpha da API Java 3D. Essa classe funciona
com um relógio fornecendo recursos de tempo usado para marcar os eventos de cada animação.
4.1.4. Interpolador
4.1.5. Alvo
A classe Alvo é responsável por adicionar um objeto ao ambiente virtual. Essa classe
só instancia objetos do tipo 2D, e usa a técnica de Billboard, fornecida pela API Java 3D para
criar a ilusão de um modelo 3D.
A técnica de Billboard faz com que o objeto sempre seja visto de frente para a câmera,
como se o objeto estivesse olhando para o usuário. Sendo assim, o usuário poderá adicionar
qualquer tipo de imagem (jpg e gif) no ambiente, e terá a impressão de ser um objeto 3D.
A classe carrega uma imagem indicada pelo usuário e cria-se uma textura a partir
dessa imagem. A textura é adicionada a uma forma geométrica de quatro pontos (retângulo).
Como o próprio nome diz, esse objeto será o alvo da animação, será ele que sofrerá
a interação dos interpoladores.
41
5. PROJETO E IMPLEMENTAÇÃO
A Figura 9 ilustra a estrutura básica do framework. Pode-se ver que, para criar um
aplicativo usando o framework, o usuário no mínimo precisará instanciar um de cada objeto
da Figura 9.
5.1.1 Construtores
profundidade. O último atributo que define a aparência do chão é passado como nulo para
o construtor trivial.
• SimpleUniverse;
• GraphicsConfiguration;
• BranchGroup;
• Canvas3D;
• AmbientLight;
• DirectionalLight;
• Chao.
Três dos objetos listados não foram comentados até o momento. O objeto
AmbientLight cria uma fonte de luz para o ambiente, funciona como se uma lâmpada estivesse
acesa, iluminando o ambiente como todo. O objeto DirectionalLight cria uma fonte de luz
direcional, como se a câmera tive uma lanterna apontada na direção do objeto. As luzes são de
extrema importância para o ambiente, sem elas não é possível a visualização dos objetos
de cena. E por fim o objeto Chao, o mesmo é detalhado no capítulo 5.1.3.
44
5.1.2 Métodos
A classe Ambiente da suporte para algumas personalizações que poderão ser feitas pelo
usuário. Detalhe do uso de cada método poderá ser observado nos subcapítulos seguintes:
Método responsável por alterar a cor de fundo do ambiente virtual. A cor de fundo
padrão para o ambiente é composta por 20% de vermelho, 0% de verde e 60% de azul,
criando um tom de azul escuro.
• Color3f bgColor – Objeto que dará cor ao plano de fundo do ambiente virtual.
Método altera o fundo do ambiente virtual adicionando uma imagem a ele. A cor de
fundo padrão para o objeto Ambiente é composta por 20% de vermelho, 0% de verde e 60%
de azul, criando um tom de azul escuro.
• String textura – Caminho físico de uma imagem, essa imagem será aplicada
ao fundo do ambiente virtual.
• Component componente – Componente Java qualquer, necessário para criação
da textura.
45
5.1.2.4 setLuzAmbiente ( )6
O uso desse método é bem simples, a cada chamada desse método o estado da luz é
alterado. Se estiver aceso irá apagar, e se estiver apagado irá acender. A Figura 10 compara os
estados da luz de ambiente.
FIGURA 10: Comparação da luz de ambiente, do lado esquerdo luz acesa e do direito luz apagada.
5.1.2.5 setLuzCapacete ( )6
A diferença da luz de capacete para a luz de ambiente é que a luz de capacete emite
um foco de luz direcional horizontal, é como se o visualizador tivesse uma lanterna apontada
para o objeto visualizado.
5.1.2.6. getCanvas ( )
Método retorna um objeto do tipo Canvas3D que deverá ser adicionado a um container.
6
A classe J3DBrowser possui dois botões que interagem com esses métodos. Leia mais sobre o J3DBrowser
no Anexo 2.
46
5.1.2.8. getEsferaDeVisualizcaoPadrao ( )
Método retorna um objeto do tipo BoundingSphere, esse objeto deverá ser usado como
delimitador de visualização do ambiente virtual. É necessário o uso desse objeto quando
houver a necessidade de mexer com a câmera.
A classe chao é usada para criar um chão no ambiente virtual. Como o próprio nome
diz, serve de base para os objetos que serão adicionados ao ambiente.
Essa classe é usada internamente pela classe ambiente sendo assim o usuário não tem
como alterar propriedades desse objeto, após ele ter sido instanciado.
A classe instancia um objeto do tipo box de tamanho fixo. Ela possui apenas
um construtor e seus métodos públicos são apenas para informativos.
5.1.3.4. getLaguraChao ( )
5.1.3.5. getProfundidadeChao ( )
Essa classe é um componente estendida da classe JToolBar, por tanto poderá ser usado
como um desses componentes, podendo ser adicionado à uma janela swing. A Figura 11
ilustra o componente Gatilho.
• Botão Iniciar – botão responsável por iniciar a animação esse botão gera o evento
que dispara o interpolador da animação.
• Botão Pausar – botão responsável por pausar a animação esse botão só funcionará
caso a animação esteja em andamento. Ao pressionar o botão iniciar novamente
a animação continuará de onde parou.
• Botão Parar – botão responsável por parar a animação, para utilizar esse botão,
é necessário que um dos outros botões esteja pressionado. Ao pressionar o botão
iniciar novamente a animação voltará ao inicio.
Nos subcapítulos seguintes serão detalhados os construtores e métodos dessa classe.
5.2.1. Construtor
5.2.1.1. Gatilho ( )
O construtor também desabilita as funções dos botões pausar e parar quando o objeto
Gatilho é criado, isso garante que os botões, só poderão ser pressionados após o inicio
da animação.
5.2.2. Métodos
A classe Gatilho não dispõe de nenhum método próprio, mais por ser estendida de
JToolBar, todos os métodos pertencentes ao pai é herdado pelo filho, sendo assim todos
as funcionalidades fornecidas pelos métodos do pai poderão ser usados em Gatilho.
49
O objeto Alpha é representado pela Figura 12. Ele é composto por um gráfico de
animação que é dividida em algumas partes. Um ponto interessante neste objeto é que não há
a necessidade de usar todos as partes representadas no gráfico, o usuário poderá escolher
quais as partes que quer usar, personalizando assim o objeto Alpha para criar uma animação
mais condizente com o esperado pelo usuário.
• Crescimento:
a. incresingAlphaDuration – Representa a linha de crescimento do gráfico,
a animação é executada seguindo o sentido do intervalo de tempo.
b. incresingAlphaRampDuration – Representa a curva de suavização da linha de
crescimento do gráfico, causando o efeito de aceleração no inicio da linha
e efeito de desaceleração do fim da linha.
• Decrescimento :
1) incresingAlphaDuration – Representa a linha de decrescimento do gráfico,
a animação é executada seguindo o sentido inverso do intervalo de tempo.
2) incresingAlphaRampDuration – Representa a curva de suavização da linha de
decrescimento do gráfico, causando o efeito de aceleração no inicio da linha
e efeito de desaceleração do fim da linha.
• Constante em um:
a. AlphaAtOneDuration – Representa o tempo da animação quando a linha está
no topo do gráfico, ou quando seu valor é um.
• Constante em zero:
a. AlphaAtOneDuration – Representa o tempo da animação quando a linha está
na base do gráfico, ou quando seu valor for zero.
Conhecendo as fases do objeto Alpha, fica fácil criar curvas personalizadas que define
a real necessidade do usuário. Na Figura 13 são representados alguns tipos de objetos Alpha
personalizados.
51
Ela disponibiliza dois construtores adicionais, que facilitam a criação desses objetos.
A seguir é descrito o uso dos construtores e métodos dessa classe.
5.3.1. Construtores
5.3.1.1. Temporizador ( )
5.3.2. Métodos
Além desses, Temporizador herda todos os métodos da sua classe pai Alpha. A seguir
pode ser visto um breve comentário das funcionalidades dos principais métodos. Maiores
informações podem ser encontrado em no site da SUN (2006b).
“Os behaviors são nós do grafo de cena usados para especificar o ínício da execução
de uma determinada ação baseada na ocorrência se um conjunto de determinados eventos”.
(BICHO, 2002).
A classe behavior serve de base para todo e qualquer tipo de interação que os objetos
sofram no ambiente virtual. A Figura 17, mostra a hierarquia das classes que estendem suas
funcionalidades.
57
• InterpoladorMRU;
• InterpoladorAceleracao.
Os mesmos são descritos nos capítulos seguintes.
5.4.1. InterpoladorMRU
5.4.1.1. Construtores
5.4.1.2. Métodos
• initialize ( ) – Esse método é chamado apenas uma vez, e é responsável por iniciar
o behavior e estabelecer condições (WakeupConditions) para reação do behavior...
• processStimulus ( Enumeration ) – Esse método processa uma ação em resposta
a um evento. Ação processada por esse método é a translação do objeto pelo
ambiente virtual (SUN, 2006b).
5.4.2. InterpoladorAceleracao
Como o próprio nome diz, podem ser criados movimentos de aceleração de um objeto.
Bons exemplos de possíveis animações são: aceleração ou desaceleração de um veículo em
linha reta ou a queda livre de um objeto.
5.4.2.1. Construtores
O construtor trivial além dos objetos fornecidos pelo usuário recebe a aceleração
e dois pontos, inicial e final.
O construtor trivial recebe cinco variáveis, três delas fornecidas pelo usuário,
aceleração e dois pontos, inicial e final.
61
5.4.2.2. Métodos
A classe Alvo é muito importante para o framework, ela é o objeto central para o
desenvolvimento de aplicações baseadas no framework, pois todos interpoladores necessitam
de um objeto para poder ser iniciado.
O objetivo dessa classe é possibilitar que o usuário crie uma animação usando objetos
complexos de serem modelados, por exemplo: carro, avião ou bola de futebol. Essa classe usa
dos recursos da classe Billboard (BOUVIER, 2000), pode carregar qualquer imagem
bidimensional (jpg, gif), ao ambiente virtual dando a impressão de ser um modelo
tridimensional para quem vê esse objeto.
Árvores, nuvens, chuva, neves, são bons exemplos de aplicação dessa técnica em um jogo
eletrônico. Uma árvore qualquer possui uma geometria complexa. Em jogos eletrônicos,
normalmente o jogador não está interessado em apreciar todos os detalhes de uma árvore. Utiliza-
se então um retângulo e uma textura para simular a geometria da árvore (ver Figura 18). A textura
contém uma projeção bidimensional da árvore. E ela é aplicado ao quadrilátero, que é exibido de
forma a sempre estar de frente para o observador. Desta forma o observador é iludido a acreditar
que está visualizando um modelo tridimensional complexo. (VALENTE, 2006).
Como visto, o Java 3D dá suporte a uso dessa técnica. A classe Alvo por sua vez,
além de facilitar o uso da classe Billboard, facilita também a criação de outros objetos que são
usados em conjunto com o Billboard, deixando transparente a criação do polígono (retângulo)
que servirá de base para a textura, a própria textura que representará o objeto a ser animado,
o posicionamento inicial do objeto no ambiente e atributos necessário para instanciação
do objeto Alvo.
A classe Alvo conta com dois construtores e disponibiliza alguns métodos para
personalização do mesmo como reposição do objeto e adequação da escala do objeto.
Nos capítulos seguintes é demonstrado como usar esses construtores e métodos.
63
5.5.1. Construtor
Construtor simples da classe Alvo recebe como parâmetros duas variáveis de extrema
importância para instanciação desse objeto, um objeto Component e um TransformGroup,
a seguir maiores informações sobre esse parâmetros:
5.5.2. Métodos
Método setImagemAlvo carrega uma imagem bidimensional que será usado como
textura de um polígono. Esse polígono tem a forma de um retângulo e servirá de base para
adição dessa textura.
Tudo isso é transparente para o usuário. Ele não precisa saber nada do funcionamento
prático, o importante é saber que ele precisa passar a String contendo o caminho para uma
determinada imagem, o restante é tudo feito internamente pela classe.
6. RESULTADOS OBTIDOS
Para interagir com os interpoladores é necessário usar a classe Alpha do Java 3D, mais
para facilitar essa tarefa, foi implementando a classe Temporizador que encapsula a classe
Alpha, diminuindo a complexidade da mesma. Além disso, essa classe implementa funções
de contagem de tempo exclusivo para os interpoladores InterpoladorMRU
e InterpooladorAceleracao. Dois construtores diferentes da classe genérica também foram
implementados, dando mais versatilidade ao usuário (ver capítulo 5.3).
Esse framework por ser implementado em Java não tem dependência com nenhuma
plataforma de hardware ou software. É necessário apenas que a máquina possua JRE
(SUN, 2006a) e o Java 3D (SUN, 2006a) instalado no sistema.
Esse trabalho mostra que a linguagem Java junto com a API Java 3D pode ser usada
também na criação de jogos eletrônicos. Foi visto anteriormente que as mesmas implementam
funcionalidades para animação de objetos, interação como o usuário final (jogadores), adição
de objetos bidimensionais, entre outros recursos, os quais podem ser visto na
API Specification do Java 3D (SUN, 2006b).
De acordo com MANSSOUR (2003), para se criar uma aplicação simples usando a
API Java 3D é necessário seguir alguns passos. A seguir há um passo a passo simplificado
para criação de uma aplicação Java 3D:
1. import com.sun.j3d.utils.geometry.Box;
2. import com.sun.j3d.utils.geometry.ColorCube;
3. import com.sun.j3d.utils.geometry.Sphere;
4. import com.sun.j3d.utils.universe.PlatformGeometry;
5. import com.sun.j3d.utils.universe.SimpleUniverse;
6. import Java.awt.BorderLayout;
7. import Java.awt.GraphicsConfiguration;
8. import Java.awt.GridLayout;
9. import Javax.media.j3d.Alpha;
10.import Javax.media.j3d.AmbientLight;
11.import Javax.media.j3d.Appearance;
12.import Javax.media.j3d.Background;
13.import Javax.media.j3d.BoundingSphere;
14.import Javax.media.j3d.BranchGroup;
15.import Javax.media.j3d.Canvas3D;
16.import Javax.media.j3d.DirectionalLight;
17.import Javax.media.j3d.Light;
18.import Javax.media.j3d.Material;
19.import Javax.media.j3d.RotationInterpolator;
20.import Javax.media.j3d.Transform3D;
21.import Javax.media.j3d.TransformGroup;
22.import Javax.swing.JFrame;
23.import Javax.swing.JPanel;
24.import Javax.vecmath.Color3f;
25.import Javax.vecmath.Point3d;
26.import Javax.vecmath.Vector3f;
27.
28.public class Exemplo1 extends JFrame{
29.
30. private JPanel pCanvas;
31.
32. public Exemplo1() {
33. InicializaJanela();
34. InicializaJ3D();
35. }
36.
37. private void InicializaJanela(){
38. // configurando janela do Browser
39. setSize(800,600);
69
94. grupo.addChild(bg);
95.
96. // Cria fonte de luz ambiente
97. AmbientLight luzAmb = new AmbientLight(
new Color3f(1.0f,1.0f,1.0f));
98. // cria e ajusta esfera de influência
99. luzAmb.setInfluencingBounds(bounds);
100. // indica estados modificáveis
101. luzAmb.setCapability(Light.ALLOW_STATE_WRITE);
102. luzAmb.setCapability(Light.ALLOW_STATE_READ);
103. //adiciona ao conteúdo
104. ramo.addChild(luzAmb);
105.
106. // cria fonte de luz direcional
107. DirectionalLight luzCap =
new DirectionalLight();
108. // ajusta cor e direção
109. luzCap.setColor(new Color3f(1.0f,1.0f,1.0f));
110. luzCap.setDirection(new Vector3f(
0.0f, 0.0f, -1.0f));
111. // cria e ajusta esfera de influência
112. BoundingSphere tudo = new BoundingSphere(
new Point3d(0, 0, 0), 100000.0);
113. luzCap.setInfluencingBounds(tudo);
114. // indica estados modificáveis
115. luzCap.setCapability(Light.ALLOW_STATE_WRITE);
116. luzCap.setCapability(Light.ALLOW_STATE_READ);
117. // monta luz na plataforma c/luz de capacete
118. PlatformGeometry pg = new PlatformGeometry();
119. pg.addChild(luzCap);
120. universo.getViewingPlatform().
setPlatformGeometry(pg);
121.
122. /********************************************/
123. // cria materia - aparência para chão
124. Appearance appChao = new Appearance();
125. Material matChao = new Material(
126. new Color3f(1.0f,1.0f,0.0f), //amarelo
127. new Color3f(0.0f,0.0f,0.0f), //preto
128. new Color3f(1.0f,1.0f,0.0f), //amarelo
129. new Color3f(1.0f,1.0f,1.0f), //branco
130. 100f);
131. appChao.setMaterial(matChao);
132.
133. //criar chão
134. Box chao = new Box(10.0f,0.2f,10.0f, appChao);
135.
136. //transformação chão
137. Transform3D tChao = new Transform3D();
138. tChao.setTranslation(new Vector3f(
0.0f,-2.2f, -15.0f));
139. TransformGroup gChao =
new TransformGroup(tChao);
140. gChao.addChild(chao);
141. grupo.addChild(gChao);
142.
143. /********************************************/
144. // cria materia - aparência para bola
145. Appearance appBola = new Appearance();
146. Material matBola = new Material(
147. new Color3f(1.0f,0.0f,0.0f), //vermelho
71
Ao usar o framework, o usuário estará aumentando sua produtividade, pois terá que
escreverá menos linhas para criar aplicações simples. O usuário também não precisará saber
como o framework trabalha, pois ele encapsula um grande número de funcionalidades da API
Java 3D, seu uso é transparente para o usuário. Além disso, o usuário iniciante torna-se
empolgado a conhecer melhor a computação gráfica, pois a base para o desenvolvimento de
aplicações 3D é facilmente tratada pelo framework.
Como visto anteriormente o framework é composto de cinco classes (ver Figura 9), elas
são muito importantes no desenvolvimento de aplicações com base no. A seguir
é apresentando um passo a passo simples para criação de uma aplicação de exemplo.
Na Listagem 11 pode ser observado um exemplo da aplicação anterior implementado agora
usando o framework.
73
Além disso, as linhas 54-120 na Listagem 10, são iniciados as funcionalidades básicas
para que possa criar um ambiente virtual. Nessas linhas, são instanciados objetos como
simpleUniverse, Background , BoudingSphere, BranchGroup, entre outros recursos (ver
capítulo 5). Já na Listagem 11 todas essas linhas são substituídas por apenas a linha 19, a qual
instancia o objeto Ambiente.
7
“javadoc - Ferramenta utilizada para criar arquivos HTML que documentam o código Java. Essa
ferramenta é usada pela Sun para criar a documentação da Java API” (DEITEL, 2005).
76
Conforme DEITEL & DEITEL (2005), “os comentários de documentação são os únicos
reconhecidos pelo javadoc. Comentários de documentação iniciam com /** e terminam com
*/. Os comentários de documentação podem abranger múltiplas linhas”. A Listagem 12
mostra um exemplo de um comentário simples de documentação:
Como visto anteriormente, o javadoc possui também algumas tags usadas para auxiliar
a criar a documentação, essas tags dão algum tipo de destaque na documentação. Essa tags
não são tags HTML, elas podem ser adicionadas a qualquer comentário e sempre iniciam com
o símbolo @. “Os tags @see e @author são usados para especificar um See Also: e uma nota
Author:, respectivamente na documentação em HTML” (DEITEL, 2005). Além disso,
é possível adicionar tags HTML ao comentário, fazendo com que a documentação fique mais
legível. A Figura 21 exemplifica o uso das tags javadoc comentadas anteriormente.
1. /**
2. * MouseRotateY is a Java3D behavior object that lets
3. * users control the rotation of an object via a mouse.<p>
4. *
5. * To use this utility, first create a transform group
6. * that this rotate behavior will operate on. Then,
<blockquote>
7. *
8. * <pre>
9. * MouseRotateY behavior = new MouseRotateY();
10. * behavior.setTransformGroup(objTrans);
11. * objTrans.addChild(behavior);
12. * behavior.setSchedulingBounds(bounds);
13. * </pre>
14. *
15. * </blockquote> The above code will add the rotate
16. * behavior to the transform group. The user can rotate
17. * any object attached to the objTrans.
18. */
19.
20. public class MouseRotateY extends MouseBehavior {
21. double y_angle;
22. double y_factor;
23.
24. /**
25. * Creates a rotate behavior given the
transform group.
26. * @param transformGroup
27. * The transformGroup to operate on.
28. */
29. public MouseRotateY(TransformGroup transformGroup) {
30. super(transformGroup);
31. }
32.
33. ...
34.
35. }
Exemplo de código para conversão em Javadoc.
7. CONCLUSÃO
Como esse trabalho, espera-se poder contribuir para o melhor entendimento da API
Java 3D, facilitando o uso da mesma na tarefa de criação de aplicações tridimensionais,
adicionando mas alguns recursos como interpoladores de movimentos mecânico,
Temporizador simplificado, importe de imagens 2D tratando-a como um modelo 3D,
configuração simplificada do universo virtual e controle dos interpoladores através de
interface gráfica, além disponibilizar recursos adicionais como visualizador, interação com
mouse e implementação de biblioteca para tratamento de aparência dos objetos.
8. REFERÊNCIAS BIBLIOGRÁFICAS
BOUVIER, Dennis J. “Getting Started with the Java 3DTM API”. Tutorial v1.5.1.
California: Sun Microsystems, Inc., 2000.
CHAVES, Alaor. “Física: Mecânica”. Rio de Janeiro: Reichmann & Affonso Ed., 2001.
ANEXO I
Pré-Condições
Ações do Ator Ações do Sistema
1. Instanciar um objeto
do tipo Temporizador.
2. Constrói um Temporizador
com os parâmetros
informados pelo usuário
(ver capítulo 5.3)
Diagrama de Classes
Esse diagrama foi utilizado na fase projeto, teve a função de definir as classes que
seriam usadas na criação do framework, definindo associações, generalizações e
especializações com as classes da API Java 3D e associações com as classes do próprio
framework. A Figura 24 ilustra como o framework está ligado com a API Java 3D.
As classes representadas na cor branca são classes da API Java 3D. As classes
representadas na cor amarela são classes do framework. E as classes representadas pela cor
verde, são classes integrantes do framework, mas não fazem parte do objetivo principal do
projeto, são classes auxiliares disponibilizadas por outros desenvolvedores.
85
Diagrama de Seqüência
O diagrama de seqüência (Figura 25) define qual a ordem de instanciação dos objetos para
criação de uma aplicação baseada no framework.
ANEXO II
A classe JD3Browser
Ela possui uma interface simples com dois botões os quais funcionam como um
interruptor para acender e apagar as luzes de ambiente e de capacetes implementadas na
classe Ambiente. A Figura 26 ilustra o objeto JD3Browser.
Essa classe foi base na classe Java3D Browser (JANDL, 2004). Boa parte dos recursos
de classe foi mantida, alguns recursos foram retirados pois não teriam usabilidade e outros
adicionados.
88
J3DBrowser ( )
Construtor padrão da classe J3DBrowser não precisa ser parametrizado. Sua função é
instanciar uma janela para adição de um ambiente virtual. A janela é dividida em dois painéis:
adicionarAmbiente ( Ambiente )
setTitulo ( String )
A Classe MouseRotateY
A classe MouseRotateY por ser usada internamente pela classe Ambiente sem que o
usuário a defina diretamente, não haverá a necessidade de comentar seus construtores ou
métodos, para maiores informações consultar o código fonte da classe, disponível de CD
anexo há essa trabalho.
A Classe Cores
A classe Cores serve de apoio para o framework, ela disponibiliza com maior
facilidades funções relacionadas a aparência de objetos (matéria, textura e cores).
Ela é composta de vários métodos constantes e por serem estáticas podem ser usadas
em outras classes, sem maiores esforços. A classe Cores define oito constantes de cores.
Os métodos e constantes definidos por essa classe são descritos a seguir:
getAparenciaPadrao ( )
Método estático da classe Cores retorna uma aparência padrão. Essa aparência tem um
tom de cor amarelada. Não necessita parametrização.
setAparencia ( Color3f )
Método estático da classe Cores recebe como parâmetro um objeto do tipo Color3f
definido pelo usuário e retorna uma aparência com o tom de cor definido.
Método estático da classe Cores recebe como parâmetro um objeto do tipo Component
e um objeto do tipo String definidos pelo usuário, esses são necessários para criação da
textura. Esse método retorna um objeto do tipo Appearance contendo a textura definida.