LAB. 4 - Departamento de Informática

Propaganda
Tecnologias de Jogos
de Vídeo
Abel J. P. Gomes & Gonçalo Amador
LAB. 4
Departamento de Informática
Universidade da Beira Interior
Portugal
2013
Copyright  2009-2013 All rights reserved.
LAB. 4
DETECÇÃO DE COLISÕES
1. Objetivos
2. Conceitos
3. Exercícios teóricos e de programação
4. Trabalho futuro
Lab. 4
DETECÇÃO DE COLISÕES
Nesta lição prático-laboratorial aprender-se-á como funciona o módulo de
colisões do motor de jogos JMOGE, quais as classes que recorrem ao módulo
de colisões, e como alterar o módulo para introduzir novas funcionalidades.
1.
Objetivos específicos de aprendizagem
Terminada esta ficha de trabalho, o aluno deve saber e ser capaz de:
1. Ativar e desativar a visualização dos volumes envolventes (em inglês
“bounding volumes”) implementados, no motor de jogos JMOGE.
2. Identificar quais as classes e métodos relacionados com a deteção
de colisões no motor de jogos JMOGE.
3. Alterar o módulo de colisões do motor de jogos JMOGE de forma a
adicionar novas funcionalidades.
2.
Deteção de colisões
O motor de jogos JMOGE suporta a visualização de 3 tipos de “Bounding
Volumes” (BVs), i.e., “Axis-Aligned Bounding Box” (AABB) e “Object-Aligned
Bounding Box” (OBB), e “Bounding Spheres” (BS), como se ilustra na Fig.1:
Figura 1: BVs suportados no JMOGE, AABB (X-Wing da esquerda),
BS (X-Wing da direita), e OBB (Tie Fighter).
Cada nodo de transformação presente na cena, i.e., cada obstáculo, cada
avatar (jogador ou NPC) e cada bala presente no grafo de cena (introduzido na
ficha 2), têm associada um BV.
No código do JMOGE e do projeto simplificado Collisions, ambos facultados, na
página web da cadeira de Tecnologias de Jogos de Vídeo (que serão alterados
no decorrer da resolução desta ficha), só são suportados testes de colisões
entre AABB e AABB ou BS com OBB/AABB. Não obstante, a visualização de
BVs, OBBs e AABB já é suportada no método renderGeometryNode da classe
TransformGroup.java. A deteção de colisões é chamada na classe
Scene.java (Fig. 2), mas os métodos de deteção de colisões que dizem
respeito à física encontram-se implementadas ou a implementar na classe
Collision.java (Fig. 3)
Figura 2: Módulo de geometria do JMOGE.
Figura 3: Módulo de física do JMOGE.
A deteção de colisões entre AABB e OBB é desnecessária, pois usa-se OBB
para precisar a deteção de colisões (mais computação), permitindo um volume
envolvente mais adaptado há geometria do modelo, como ilustrado na Fig. 4:
Figura 4: Deteção de colisões com AABB (esquerda) e OBB (direita).
Uma deteção imprecisa de colisões resulta em artifícios visuais difíceis de
resolver, como ilustrado na Fig. 5:
Figura 5: Resultado de uma má deteção de colisões,
possivelmente apenas “Broad Phase” no jogo Mercenaries 2.
No final desta ficha estarão implementadas colisões entre OBB e OBB, entre
AABB e AABB, entre BS e BS, entre OBB/AABB e BS, e entre BS e OBB/AABB. A
deteção de colisões aqui implementada, antes e após as modificações a
realizar nos exercícios de programação que se seguem, é somente do tipo
“Broad Phase”. Para realizar deteção do tipo “Narrow Phase” seria necessário
alterar as classes Collision.java e Mesh.java. De notar que as classes que
estendem a classe Mesh.java implementadas na ficha 3 herdariam estas
alterações. Na deteção do tipo “Narrow Phase” é necessário aceder há
informação geométrica da Mesh, associada a determinado BV, por forma a
processar intersecções entre/com os seus triângulos e/ou quadrângulos, bem
como os respetivos vértices.
Apenas as classes de módulos pertinentes à deteção de colisões no JMOGE,
encontram-se no projeto minimal facultado (Collisions), de forma a facilitar a
aprendizagem. Todos exercícios da ficha 2 encontram-se ainda por resolver,
i.e., quem não tenha previamente concluído a ficha 2 terá de o fazer agora
também. A documentação em Javadoc encontra-se facultada no projeto
Collisions.
3.
Exercícios teóricos e de programação
Exercício 1.
Caso não tenha ainda concluído a ficha 2, conclua-a no código do projeto
Collisions, consulte os “TODO: (SceneManagement) ...” nos “Action items”
do Netbeans, de forma a identificar as alterações a realizar. Após concluída a
ficha 2, inicialmente vamos apenas, ativar a visualização de BVs. Para realizar
esta tarefa, na versão disponibilizada do projeto Collisions, identifique no fim
do método gameUpdate, na classe GameMain.java, a seguinte linha de
código:
0. //bullet.getBoundingVolume().setRenderBoundingVolume(true);
De seguida, descomente esta linha, compile o projeto e volte a executar o
código. A visualização das BV estará ativada para cada bala criada/disparada,
aquando o desenho desta na classe TransformGroup.java, no método
renderGeometryNode. Por omissão o desenho de cada objeto do tipo
BoundingVolume, associado a um dos TransformGroup, no grafo de cena
está a falso. Existe comentada uma linha semelhante para cada jogador ou
obstáculo para ativar a visualização de BVs. Por omissão qualquer BV criado
não é desenhado a menos que esta funcionalidade seja ativada
explicitamente.
Exercício 2.
O exercício 2 consiste na implementação da deteção de colisões entre BS e BS,
para o identificar procure nos “Action Items” do Netbeans por “TODO:
(Collisions) SPHERE with SPHERE ...”, na classe Collision.java. Em
comentário no código estão indicadas ajudas e/ou links de apoio.
Exercício 3.
O exercício 3 consiste na implementação da deteção de colisões entre
OBB/AABB e BS, para o identificar procure nos “Action Items” do Netbeans por
“TODO: (Collisions) OBB/AABB with SPHERE ...”, na classe Collision.java.
De referir que em comentário no código estão indicadas ajudas e/ou links de
apoio.
Exercício 4.
O exercício 4 consiste na implementação da deteção de colisões entre OBB
OBB, para o identificar procure nos “Action Items” do Netbeans por “TODO:
(Collisions) OBB with OBB ...”, na classe Collision.java. De referir que em
comentário no código estão indicadas ajudas e/ou links de apoio. Também de
frisar que é importante perceber bem a deteção de colisões entre AABB e
AABB, teste que inicia na linha 38 e acaba na linha 47 da classe
Collision.java.
Nota: Antes de testar o código neste exercício é favor alterar todo os BVs do
tipo AABB para OBB, na classe GameMain.java, para identificar o local a
realizar estas alterações procure nos “Action Items” do Netbeans por “TODO:
(Collisions) when working replace AABB with OBB …”.
Exercício 5.
Vamos agora avaliar os conhecimentos adquiridos com algumas questões
teóricas:
1. Porque razões a deteção de colisões “Broad Phase” não chega em
alguns casos, sendo necessário também “Narrow Phase”? Justifique.
2. Porque razão se usam OBB e não AABB ou vice-versa? Justifique.
3. Os métodos para detetar colisões de um para vários, e.g., entre
jogadores e todas as balas podiam ser mais eficientes? Justifique.
4. Se fosse implementar um jogo em 2D, e.g., um jogo 2D de plataformas,
adicionaria uma classe nova designada BoundingPoligons.java para
“Axis-Aligned Bounding Squares”, “Object-Aligned Bounding Squares” e
Bounding Circles”? Justifique.
4.
Trabalho futuro
Se o aluno tiver atribuído um projeto de deteção de colisões na fase fina (do
inglês “Narrow Phase”), neste momento o referido pode começar a a debruçar-se sobre o dito projeto. O aluno deverá implementar o método indicado nos
“Action Items” do Netbeans por “TODO: (Projects) implement narrow
phase method.”, podendo se achar necessário alterar o cabeçalho do
método.
Além dos projetos a realizar existem diversas expansões ao JMOGE que findada
esta ficha podem ser alvo de estudo, algumas a titulo de sugestão:
1. Paralelizar via multithreading em Java alguns dos métodos de deteção
de colisões de um para muitos, na classe Collision.java.
2. Implementar uma nova classe designada BoundingPoligons.java para
“Axis-Aligned Bounding Squares”, “Object-Aligned Bounding Squares” e
Bounding Circles”. Este serviria apenas para jogos a 2D.
3. Implementar OBBs dinâmicos, i.e., OBBs que se um boneco mexer por
exemplo um braço seja se necessário substituído por um novo OBB mais
adaptado ao objeto.
Download