Versão 0.1

Esta versão representa a primeira versão do código fonte do projeto, que pode ser baixado desta página. O código atual apresenta uma versã em wireframe do jogo, ainda sem iluminação, que será introduzida na próxima entrega.

Dentre as funcionalidades já implementadas nesta versão, destaca-se a utilização de modelos complexos todos carregados de arquivos no formato VTK (inclusive o terreno). O loader de arquivos VTK calcula as normais interpoladas em cada vértice, que serão utilizadas pelo OpenGL para aplicar o modelo de tonalização de Gouraud quando a iluminação for implementada no projeto. Um arquivo VTK é um arquivo texto em que um modelo 3D é descrito da seguinte forma:

# vtk DataFile Version 2.0
created by quick3D 4.0 (www.quick3D.com)
ASCII
DATASET POLYDATA
POINTS 850 float
1100.386597 -0.039600 0.136570
1100.327271 -0.039600 -0.501375
1100.110718 -0.039600 -2.283372
(...)
POLYGONS 1668 6672
3 0 1 38
3 0 38 37
3 1 2 39
3 1 39 38
(...)

As quatro primeiras linhas correspondem a um cabeçalho que dá informações sobre o arquivo e o tipo de dados que ele contém. Na quinta linha está indicado o número de vérticas do modelo, no caso 850. Nas 850 linhas seguintes, neste caso, estão os dados de x, y e z de cada um dos vértices. A seguir vem a informação de que o modelo possui 1668 faces e nas 1668 linhas seguintes estão os dados de cada uma delas. Nestas linhas com informações sobre as faces o primeiro número diz o número n de vértices de que a face é composta, e os n números seguintes são os índices dos vértices que formam a face.

O loader obtém essas informações de cada arquivo VTK e as utiliza para calcular o vetor normal de cada face e, posteriormente, realiza a interpolação dos vetores em cada vértice para o cálculo da normal destes.

Outros destaques desta versão incluem:

Movimento independente dos modelos

O tanque é divido em 3 modelos distintos: Lançador, Canhão e Base.
O lançador é a parte em que os projéteis são lançados. O lançador possui apenas o movimento de rotação vertical restrito de 0º a 45º.
O canhão é a parte que sustenta o lançador e possui um movimeto de rotação definido no domínio de -90º a 90º.
A base é a parte que sustenta o canhão e possui um movimento de translação para frente e para trás podendo rotacionar em torno do seu eixo livremente.

Para a movimentação independente para cada modelo carregado são aplicadas as mesmas tranformações aplicadas para a parte que a sustenta e mais as suas transformações particulares. Por exmplo, se o tanque estiver rotacionado de 40º e o canhão rotacionado de 25º, então a ponta do lançador estará apontada para o ângulo de 65º.

Movimentação da câmera

A movimentação da camera é dependente das transformações aplicadas no tanque para reproduzir uma impressão de jogador em 1º Pessoa.

A posição da câmera é a mesma posição do tanque deslocada para trás, permitindo a visualização completa do objeto. A direção para onde a câmera aponta é a mesma que a base do tanque aponta acrescida de um fator sobre a direção do canhão e do lançador gerando assim um movimento da câmera para qualquer movimento que seja aplicado nos objetos, fazendo com que a câmera acompanhe os modelos.

Além disso, também está disponível uma engine física funcional e quase completa (falta apenas inserir o cálculo da resistência do ar e melhorar a detecção de colisões).

Por se tratar de uma primeira liberação, muitas coisas ainda não totalmente terminadas ou bem polidas. Mais especificamente, a interação com o usuário ainda é primitiva e todo o feedback do jogo é fornecido por meio do console (um HUD - Heads-Up Display - gráfico ainda será inserido nas próximas versões), e a contagem do placar ainda não está implementada.

Download

Para baixar o código fonte da versão mais recente do projeto, visite a página de downloads utilizando o menu de navegação.

Interação com o usuário

O usuário interage com o sistema por meio do teclado e do mouse. As teclas para movimentação do tanque são as seguintes:

Teclas W e S

Movimentam o tanque para a frente e para trás, respectivamente.

Teclas A e D

Fazem o tanque rotacionar em torno do próprio eixo nos sentidos anti-horário e horário, respectivamente.

Segurar tecla CTRL mais movimento do mouse

Com a tecla CTRL segurada, o mouse passa a controlar o movimento das partes articuladas do tanque. Movimentos laterais do mouse fazem a cabine sobre a base do tanque rotacionar sobre seu eixo, e movimentos verticais do mouse fazem o canhão do tanque ter seu ângulo aumentado ou diminuído.

Tecla F

Ativa/desativa o farol do tanque.

Teclas + e - do teclado numérico (ou ScrollWheel do mouse)

Aumenta e diminui a força do disparo, respectivamente.

Teclas 1, 2 e 3

Utilizadas para escolher o tipo de projétil que se deseja lançar.

Clique do botão esquerdo do mouse

Dispara o projétil com os parâmetros selecionados.

Problemas conhecidos desta versão

Esta versão do projeto apresenta ainda algums bugs que não puderam ser solucionados a tempo da liberação, dentre os quais destacam-se:

  • Em algumas situações o projétil lançado sofre algumas rotações inesperadas, fazendo com que não se movimentem de uma forma natural;
  • Em algumas situações o projétil é lançado de uma posição abaixo do canhão;
  • Os modelos dos alvos ainda são provisórios e serão trocados por modelos no formato Wavefront/OBJ nas próximas verões;
  • Ainda não é tratada a situação em que o tanque sai dos limites do terreno;
  • O tanque ainda não acompanha corretamente as ondulações do terreno.

Screenshots desta versão

Seguem mais algumas imagens capturadas do projeto em execução em seu estado atual:

Modelo de tanque a ser utilizado

Exemplo de modelo de projetil a ser utilizado

Na página de screenshots podem ser encontradas várias outras imagens desta fase do desenvolvimento do projeto.

Diagramas UML

São apresentados a seguir alguns diagramas UML de como os componentes do projeto foram desenvolvidos e como se inter-relacionam:

Diagrama de classe do pacote core

Diagrama de sequencia do pacote factory

Diagrama de classe do pacote engine

Diagrama de classe do componente loader

Diagrama de sequencia do componente render