Principal

Ver. 0.0

Ver. 0.1

Ver. 0.2

Ver. 0.2

Ver Final

Versão Final

A diferença da versão final com a descrita até aqui é, em termos visuais, o cenário, que é são planos texturizados, um BoxView com a porta e outro com uma imagem de quadro, e uns tacos reproduzidos em uma parede.

Em termos funcionais, a diferença é grande, pois existe toda a implementação da física, utilizando um port da biblioteca da ODE para o Java. Infelizmente, essa não foi uma boa escolha, pois o projeto está desativado e, apesar das simulações simples desejadas, muitos problemas ocorreram. Não houve tempo de reimplementar com outra biblioteca.

O programa se divide em Modelo e View. As classes modelo são as utilizadas pelo simulador físico. As classes View apenas pegam alguns dados pertinentes desses objetos, com posição, rotação, etc, e criam a visualização para o usuário. O Ode já possui primitivas de esferas e cubos para serem criados no espaço de colisões, e também uma função TriMesh (que se revelou particularmente problemática) para criar superfícies com base em triângulos. Assim, a conversão dos modelos visuais para os que podem ser simulados foi relativamente simples.

Uso:
Aperte o botão esquerdo do mouse para lançar a bola. O tempo do botão apertado determina a força. Segurando o botão direito você controla a visão (sempre centrada na bola branca) ao movimentar o mouse. Espere a simulacão física acabar (pode demorar um pouco, mais sobre isso adiante), e jogue novamente.

Fora isso:
Mouse Wheel -> Zoom
r -> libera rotação vertical além do nível da mesa.
t -> torna visível ou nao o taco. (Durante a simulação ficara sempre escondido)
c -> Habilita/desabilita o cenário.
1 -> Habilita/desabilita Luz 1
2 -> Habilita/desabilita Luz 2
3 -> Habilita/desabilita Luz Ambiente.

Problemas:

- Não existe uma "lógica" de jogo. No momento o programa serve apenas para brincar e praticar. A única lógica implementada nesse sentido é a remoção de bolas encaçapadas.

- Simulação Física. A utilização do ODEJava foi, em retrospecto, um erro. O projeto está parado, mas o problema é que mesmo funções básicas apresentam problemas sérios, que só foram descobertos no meio da implementação, e quando já não havia mais tempo de mudar a base. Os problemas ficaram mais acentuados quando se passou a desenhar a mesa como diversos triângulos (a função GeoTriMesh do Ode). A idéia disso era utilizar a mesma lógica para construir o formato da mesa (quase inteiro gerado dinamicamente, sem coordenadas fixas) tanto para o OpenGL como para o ODe. Infelizmente, superfícies planas geradas com TriMesh são particularmente problemáticas em gerais vetores normais de colisão com valores inválidos. Adicionei verificações extras para tentar minimizar esses problemas mas eles ainda ocorrem com certa freqüência (a bola desvia sem bater em nada). Ode também só passou a implementar atrito recentemente, e não está habiltiado no OdeJava. Criei uma função minha de damping para esse caso. Finalmente, objetos com velocidade muita rápida podem "atravessar" outros sem gerar um evento de colisão. Apesar de tentar compensar esses erros, problemas com a simulação vão ocorrer. Foram tomadas algumas medidas para evitar looping eternos ou bolas escapando da mesa, mas ainda sim esperem ver algumas cenas... não esperadas.

- Otimização. Por ser uma projeto de aprendizado, o código está extremamente não otimizado.

Download:

Bilhar_IA725_jar - Arquivo jar executável (para Windows)

Bilhar_IA725_src - Código fonte, incluindo imagens.

IMPORTANTE:
Apesar de estar em Java, este programa utiliza duas bibliotecas nativas presentes:

JOGL: https://jogl.dev.java.net/
ODEjava: https://odejava.dev.java.net/

Os dlls para Windows estão incluídos e, se deixados no mesmo diretório do JAR, devem permitir a execução. Caso contrario recomendo abrir o source no Eclipse e configurar as bibliotecas incluindo apontando para as dlls nativas.