Tecnologias de Jogos de Vídeo Abel J. P. Gomes & Gonçalo Amador LAB. 9 Departamento de Informática Universidade da Beira Interior Portugal 2012 Copyright 2009-2012 All rights reserved.
1. Objectivos 2. Conceitos 3. Exercícios de programação LAB. 9 SISTEMAS DE PARTÍCULAS
Lab. 9 SISTEMAS DE PARTÍCULAS Nesta lição prático-laboratorial aprender-se-á como funciona um motor simples de partículas. Irão também ser abordados alguns dos casos em que os motores de partículas são empregues, para simular determinado efeito. 1. Objectivos específicos de aprendizagem Terminada esta ficha de trabalho, o aluno deve saber e ser capaz de: 1. Saber implementar um motor de partículas simples. 2. Identificar quais os possíveis casos de uso e limitações de um sistema de partículas. 3. Identificar de que forma o motor de partículas a implementar poderá ser adicionado ao módulo da física do motor de jogos GameProject, e para que possíveis usos. 2. Sistemas de Partículas Os sistemas de partículas foram primeiramente concebidos para serem usados em filmes e só mais tarde foram também utilizados em jogos, a título de exemplo o jogo Quake II, como ilustrado na Fig. 1. O conceito inerente por detrás de um motor de partículas é que toda a matéria é constituída por milhões de átomos. No entanto, devido há quantidade enorme de átomos necessários, o que implicaria uma enorme capacidade de processamento, para simular algo complexo como um água dentro de um copo, utiliza-se número muito menores de elementos (i.e., partículas), na casa das dezenas até aos milhares. Uma vez que podem existir múltiplos sistemas de partículas em simultâneo, o número de partículas varia dependendo da quantidade de sistemas a simular e do número de partículas em cada sistema. Existem dois tipos de sistemas de partículas: os simples e os complexos. O que os distingue é que nos sistemas simples as partículas podem ou não mover-se e é incomum existirem testes de colisões entre estas. Nos sistemas complexos as partículas obedecem a regras físicas, que como é o caso das simulações
realistas de líquidos, como ilustrado na Fig. 2. As partículas podem ainda conter informação sobre a geometria da partícula em função da sua proximidade com partículas vizinhas. Figure 1: Efeito de squish de sangue no jogo Quake II suportado por um sistema de partículas simples. Os sistemas de partículas servem em particular para simular fenómenos naturais, e.g., nuvens, bolhas de ar dentro de água, cascatas, explosões, etc. Em jogos utilizam-se motores de partículas simples ou com números reduzidos de partículas de forma a assegurar o desempenho em tempo real dos jogos. No entanto em industrias como a de filmes de animação por computador sistemas de partículas de elevada complexidade com números de partículas, na casa das dezenas de milhar, são empregues. Um sistema de partículas possui por norma duas entidades distintas: partícula, e um gestor de partículas. A partícula tem como propriedades mínimas a sua posição, e tempo de vida. Uma partícula pode durar para sempre mas
dependendo do uso pretendido morre ao fim de algum tempo. Um efeito de partículas acaba quando todas as partículas morrem. O gestor de partículas cria e atualiza cada uma das partículas a seu cargo ao longo do tempo. É comum um gestor ter implementados diferentes efeitos de partículas. Figure 2: Simulação de líquidos recorrendo a um sistema de partículas complexo.
Para esta ficha é disponibilizado um projecto de apoio em JOGL que depois de concluído será um sistema de partículas simples. O projecto referido tem 4 classes, das quais apenas nos interessam as classes: Particle.java, ParticleSystem.java e Main.java. A classe Particle.java implementa uma partícula simples. A classe ParticleSystem.java implementa o gestor de partículas. A classe Main.java, é a classe principal onde é configurada uma aplicação gráfica em JOGL, e quando uma tecla do rato é premida um efeito de partículas é gerado (após a realização dos exercícios que se seguem. 3. Exercícios de programação Exercício 1: Após fazer o download do projecto de apoio em JOGL, vamos primeiramente acabar de implementar a classe Particle.java. Uma partícula tem uma posição, uma velocidade, uma aceleração, um tamanho, uma cor, uma idade, e um tempo máximo de vida. Nesta classe falta implementar dois métodos: 1. public void update(); 2. public boolean isdead(); O método update() consiste em atualizar para uma determinada partícula a sua a posição, velocidade, aceleração, tamanho, cor, e idade. O método isdead() serve apenas para verificar para uma determinada partícula se esta atingiu o seu tempo de vida máximo permitido. Cada partícula é desenhada como um ponto colorido numa determinada na posição espacial que esta ocupa. Dica: Em todas as classes a completar existem instruções em forma de comentário nos métodos a completar. Após concluída a implementação da classe Particle.java. É necessário concluir a implementação da classe ParticleSystem.java. Nesta classe apenas é necessário completar o método: 3. public void update(); Este método consiste em atualizar as partículas existentes no sistema de partículas, e remover todas as partículas que tenham falecido. Se feito corretamente neste momento ao correr a aplicação terão a cada clique de rato um sistema de partículas criado no centro da janela da aplicação, que simula um efeito que aparenta ser uma explosão. De notar que se forem feitos cliques de rato repetidos com alguma rapidez, vão ser criádos vários sistemas de partículas e não apenas um.
Exercício 2. O exercício 2 consiste em alterar os parâmetros passados ao construtor na criação de um novo sistema de partículas na classe Main.java no método: 4. @Override 5. public void mouseclicked(mouseevent e) { 6. particlesystems.add(new ParticleSystem(100, new Point3f(), 4, 100)); 7. } Exercício 3. Altere o construtor da classe Particle.java, e se necessário na mesma classe altere também o método: 8. public void update(); De forma a que o seja feito um efeito que não o de uma explosão, e.g., cascata tornado, etc. Idealmente seria preferível que houvessem dois construtores uma para cada efeito, i.e., explosão e outro(s). Exercício 4. O sistema de partículas implementado poderia ser melhorado em diversos aspectos: Associar cada partícula a um texel de uma textura. Estender para um sistema complexo, exemplo um simulador de líquidos que recorra a Smoothed Particle hydrodynamics (SPH). Implementar colisões inter-particulas. Permitir dentro do mesmo sistema tipos distintos (em alguma propriedade adicional) de partículas. As partículas podiam ter uma idade fixa, o sistema corresponder a um objecto na cena, e.g., uma parede de tijolos, e o sistema permitira um objecto fragmentável. Etc. Após integrar o sistema de partículas no módulo da física do motor de jogos GameProject (suponha que o fez) algumas questões a ponderar se levantam: Que efeitos de partículas poderia adicionar ao motor de jogos GameProject? Existiriam efeitos distintos dependendo do tipo de jogo, e.g., jogo de naves ou aviões, FPS, jogo de carros, etc? Justifique. Suponha que o sistema de partículas representava uma parede, e cada partícula, um tijolo ou porção da parede. Porque razão em alguns jogos o sistema é removido após a destruição da parede?