Algoritmos para Detecção de Colisões em Ambientes Gráficos BidimensionaisRodrigo R. Ferreira1, Rafael R. Ferreira1 [email protected], [email protected] Abstract. Several games and application needs algorithms capable of detect collisons quickly and efficiently always bearing in mind the improvement of the rates of frames per second (fps). The main purpose of this paper is to demonstrate the Quadtree technique for collision detection in 2D environments, as well as talking about procedures to make detection more efficient with the use of tree structures, and space partitioning. This study is based on a theoretical survey on printed and electronic publications.The relevance of this issue stems from the huge growth in the area of digital entertainment and need for research that will improve the analysis on the contemporary technologies related to collision detection. Resumo. Diversos jogos e aplicações necessitam de algoritmos capazes de detectar colisões de forma rápida e eficiente tendo sempre em vista a melhoria das taxas de quadros por segundo, fps (frames per second). O objetivo deste artigo é demonstrar a técnica de Quadtree para detectar colisões em ambientes 2D. Este estudo baseia-se em um levantamento teórico, sobre publicações impressas e eletrônicas. A relevância do tema decorre do grande crescimento na área de entretenimento digital e da necessidade de pesquisas que venham a aprimorar as análises sobre as tecnologias contemporâneas com relação à detecção de colisões. 1. Introdução Um ambiente gráfico dinâmico, seja um jogo ou um simulador virtual, necessita transcrever da forma mais realista possível às características físicas do mundo real permitindo um maior envolvimento do usuário com a aplicação. Uma das principais características que deve ser levada em consideração é a impenetrabilidade, isto é, a propriedade da matéria que consiste na impossibilidade de dois corpos ocuparem no mesmo tempo o mesmo lugar no espaço. Partindo dessa premissa, se dois corpos colidirem em um cenário virtual, suas velocidades, direções e formas podem se modificar. No entanto, esta tarefa não é trivial e tem se caracterizado muitas vezes como um gargalo no desempenho em aplicações que simulam ambientes gráficos interativos, isso porque o custo computacional pode ser alto [Santos 2007]. Um dos maiores problemas no tratamento de colisões é o de realizar o mínimo de cálculos possíveis, melhorando conseqüentemente o tempo de resposta e sem perder a precisão [Taddeo 2005]. O primeiro item deste artigo traz a presente introdução, o segundo item apresenta uma fundamentação sobre tratamento de colisões, o terceiro item aborda técnicas de envoltórios geométricos, o quarto item apresenta técnicas de Está técnica baseia-se no na coerência temporal dos objetos na cena. pois. K-DOP (Discrete Orientable Polytopes) [Santos 2007. geralmente os objetos se movem a pequenas distâncias entre os quadros (frames) de uma animação [Rocha 2007].decomposição espacial. procurando uma melhor relação entre custo de processamento e precisão na detecção (Figura 1). se e somente se. esses volumes podem ser representados por suas respectivas projeções nos eixos coordenados x e y. As estruturas envoltórias mais utilizadas são: Esferas (Bounding Spheres). “Um par de caixas envolventes podem colidir. contudo esta tarefa consome muito recurso computacional e deve ser evitada ao máximo. Geralmente são aplicadas formas geométricas simplificadas. no caso de um cenário bidimensional (Figura 2). É possível mostrar que se os intervalos resultantes das projeções nos eixos estão se sobrepondo. Varredura e Corte (Sweep & Prune) O algoritmo de Varredura e Corte (Sweep & Prune) é uma técnica utilizada na etapa abrangente para detecção da colisão. seus intervalos se sobrepõem em todas as dimensões” [Cohen 1994]. então. 2. as AABB's estão colidindo [Rocha 2007]. Oriented Bounding Box (OBB). muitas vezes realizando o teste de colisão pixel a pixel. 3. . O teste é feito calculando a interseção entre caixas alinhadas aos eixos (AABB). Envoltórios Convexos. Figura 1: Comparativo entre envoltórios volumétricos [Kimmerle 2005]. exceto quando a aplicação exige um alto nível de precisão e a eficiência não é um fator crítico. Bradshaw and O´Sullivan 2004]. Envoltórios Em muitos casos a colisão pode ser testada utilizando a própria geometria do objeto [Rocha and Rodrigues 2007]. Axis Aligned Bounding Box (AABB). o quinto item discute sobre testes realizados com uma Quadtree. a lista esteja próxima de estar ordenada. criando uma estrutura de dados hierárquica utilizada de forma a auxiliar no processo de detecção da colisão [Santos 2007]. Para evitar a sobrecarga na aplicação por causa da atualização das listas. e a partir destas. os testes de colisão precisam ser efetuados apenas em objetos que estiverem em uma mesma célula (subdivisão criada pelo algoritmo de decomposição espacial). que realizem uma ordenação em tempo linear [Rocha 2007]. K-d trees.Figura 2: Sobreposição de valores no eixo na técnica de Sweep & Prune [COHEN et al. localizados em células diferentes. Técnicas de Decomposição Espacial A idéia principal do particionamento do cenário tem como base a coerência espacial dos objetos. 1994] Para descobrir se duas AABB's estão colidindo é preciso manter uma lista ordenada com os intervalos de todas as caixas (uma lista para cada eixo). Exemplos de estruturas de particionamento são as Quadtree. também é utilizada na narrow phase para verificar se os pares de objetos descartados na fase anterior estão realmente colidindo [Taddeo 2005]. A utilização de estruturas de decomposição espacial não é restrita à broad phase.. derivar os pares colidentes. pares de objetos distantes um do outro. é bem provável que. BSP Trees entre outras [Lin and Manocha 2003]. “O Sweep & Prune possui complexidade media de O(n m) . pois. R-Trees. no próximo quadro. possuem poucas chances de colidirem em um determinado instante. A decomposição espacial é realizada pela divisão recursiva do cenário. Com no quadro atual as listas estão ordenadas. onde n e o numero total de caixas e m e o número de caixas em estado de colisão [Santos 2007]. não precisam ser testados. . devem ser utilizados algoritmos eficientes. 4. os círculos maiores representam a primeira divisão da quadtree que gera quatro nós filhos do nó raiz. 5. algoritmos de compressão de imagens. e assim sucessivamente até que alcance um determinado tamanho e pare de dividir (Figura 2). simulações astronômicas. Uma quadtree divide um cenário em quatro partes de tamanhos iguais. a computação exigida para determinar se a esfera em . que são os nós folhas das células um e quatro representando a última divisão do cenário. onde o círculo no topo da árvore é o nó raiz. representando todo o ambiente virtual. e divide essas partes em outras quatro partes. Figura 3: Árvore subdividida Na Figura 3 temos a representação hierárquica da divisão do cenário. também é muito utilizada no processamento de imagens. Coerência Espacial e Testes de Colisão Considerando que as esferas menores da Figura 4 estão em um quadrante diferente da esfera do quadrante 1. entre outras [Goetze 2006]. O termo Quadtree é utilizado para descrever uma classe de estruturas hierárquicas cuja propriedade em comum é o princípio da decomposição recursiva do espaço. sendo esta o nó raiz (root node). muito utilizado em ecografias na medicina para facilitar a localização de tumores. e por último temos os círculos simbolizados da letra A até H.5. A estrutura da árvore é montada a partir da cena principal. Quadtree Existe atualmente uma grande variedade de estruturas de dados hierárquicas que são utilizadas para representar dados espaciais. As quadtrees são estruturas de dados que utilizam o conceito de árvore em programação para otimização computacional onde cada nó da árvore possui até quatro filhos [Rose 2004]. O uso de quadtrees não se limita apenas ao processamento eficiente em testes de detecção de colisão. levando em consideração a coerência espacial dos objetos dispostos no ambiente gráfico para reduzir o número de testes de sobreposição de corpos [Nonato 2000].1. e cada uma das subdivisões serão filhas de suas divisões superiores. As partes que não sofrerem divisões serão as folhas (leaves). Quando se trata de detecção de colisões esta técnica segue o mesmo princípio básico das estruturas de decomposição espacial discutidas anteriormente. em aplicativos como o 3D Studio Max para se fazer o controle de profundidade de cor para sombras Ray Trace. Figura 4: Duas subdivisões . podendo . A solução para isso é continuar subdividindo os quadrantes apenas enquanto eles tiverem mais de um objeto. Variações das Quadtrees Em algumas situações pode acontecer dos objetos não estarem distribuídos uniformemente pelo cenário. Se o particionamento da cena em quatro quadrantes possui tantos benefícios. isto leva a uma árvore adaptada representada pela figura abaixo. pois os quadrantes 2. Pode acontecer também de em alguns casos um objeto ultrapassar os limites de um dos quadrantes. portanto não possuem filhos na árvore. já que a esfera maior está no quadrante 1 neste momento e os testes de colisão serão feitos apenas para os pares deste quadrante. Numa quadtree com quatro subdivisões a redução é de 75%.16 quadrantes Na Figura 4 cada um dos quatro quadrantes existentes foi subdividido em outros quatro menores resultando em dezesseis quadrantes. pois a esfera vermelha encontrase isolada no quadrante 1. é um desperdício de memória.3 e 4 podem ser eliminados. resultando em uma árvore com folhas vazias e sem utilidade alguma. Um dos problemas relacionados ás quadtrees é o fato de não existir balanceamento. 5. resultando em uma sobreposição das imagens. Neste caso em particular a redução é de 100%.movimento colidiu ou não com as esferas estáticas é reduzida substancialmente. nenhum teste de colisão será feito. evitando o uso desnecessário de memória. e à medida que se aproxima delas será necessário fazer a análise apenas no conjunto de esferas do quadrante em que nosso objeto em movimento se encontra. Notem que apesar de alguns quadrantes possuírem objetos.2. porque então não continuar a divisão dos quadrantes em partes ainda menores? É exatamente isto que pode ser feito para aumentar ainda mais a eficiência e velocidade do cálculo dos testes de colisão diminuindo o tempo computacional envolvido. Sem a utilização da técnica de particionamento espacial teríamos de fazer oito testes de colisão [Rose 2004]. pois agora a esfera em movimento precisa estar bem próxima das esferas estáticas antes que seja necessário verificar uma possível colisão. Nestes deve-se incluir o objeto em ambos os quadrantes que ele intercepta. do contrário. ocorreria um erro ao considerar se o teste de colisão do objeto em movimento deve ser testado contra o objeto estático. eles não foram subdivididos. o que seria uma fatalidade no contexto em estudo [Rose 2004]. Não faz sentido armazenar essas partes vazias da árvore. Pode-se perceber como isso melhora ainda mais a eficiência do teste de colisão. caso o método (c) seja chamado. (b) NoQuadTree (XEsquerda. Altura) (c) SubDividir() (d) AdicionarObjeto (ObjetosColisao objeto) (e) RetornaObjetosColisao (ObjetosColisao objeto. YEsquerda. Primeiramente o construtor (b) é chamado. seguido da largura e da altura do ambiente onde irão ser testadas as colisões. as variáveis em (a) representam o vetor de sub-nós do nó em questão. envolvia a criação de alguns métodos básicos para criação e manutenção dos nós e objetos na árvore. Em seguida é chamado o método (c) para criar os quadrantes menores.acontecer de algumas ramificações da árvore tornarem-se muito grandes e outras pequenas com poucos nós. Implementação da Quadtree O desenvolvimento da classe responsável por representar a estrutura hierárquica proveniente da decomposição espacial do cenário. 5. recebendo como parâmetros de entrada o valor x e y do centro do eixo coordenado na aplicação. Vetor<ObjetosColisao>m_ObjColisao=newVetor <ObjetosColisao>(). (a) NoQuadTree[] m_SubNos. e um vetor responsável por armazenar todos os objetos que pertencem aquele sub-nó.2. Largura. isto acabaria deixando a busca mais lenta. lembrando que o número de chamadas a este método terá um impacto direto no processamento da aplicação (Figura 5). . toda a árvore será montada a partir deste nó inicial. out ObjPotColisao) (f) AtualizaObjeto (ObjetosColisao obj) Para a construção da árvore o único nó que precisa ser instanciado é o nó raiz. este irá gerar recursivamente todos os outros. 3. as AABB’s neste caso possuem um ajuste perfeito ao objeto em seu interior.Figura 5: Fluxograma da subdivisão da árvore. Todas as inserções. A técnica de envoltório utilizada na aplicação foi a de Caixas alinhadas aos eixos (AABB). tornando o cálculo o mais eficiente possível. basta percorrer o vetor de objetos da cena e passá-los como parâmetro para o método (e). sendo adicionados apenas aos sub-nós referentes aos quadrantes que o objeto está colidindo. todos os objetos do cenário são inseridos na árvore através do método (d). 5. Ambiente Desenvolvido Foi desenvolvido uma aplicação criar objetos bidimensionais em um cenário de 1000x600 pixels. podem colidir. . além disso. portanto. o motivo desta escolha é que os objetos possuem uma geometria simples e invariável com o passar do tempo. Após a criação dos sub-nós. Feito isso. que irá retornar todos os objetos que estão no mesmo quadrante e que. onde cada um desses objetos irá iniciar numa posição inicial gerada aleatoriamente dentro dos limites do cenário. remoções e busca na árvore é feita em vetores ordenados utilizando algoritmos de busca binária para realizar estas operações. No teste realizado na Figura 8 foi executada a aplicação uma série de vezes. e os pretos (Figura 6 (c)) não estão. seguido do número máximo possível de testes que podem ser realizados. e a cada nova execução o número de objetos foi incrementado. A Figura 6 mostra a interface da aplicação em execução. o algoritmo da quadtree precisa testar menos pares de objetos para saber se estes estão colidindo. Figura 7: Número de divisões da quadtree por número de cálculos de colisão realizados. onde os blocos em azul (Figura 6 (a)) estão em um estão de colisão. acrescentado 40 objetos ao . À medida que são criadas mais sub-regiões na cena. baseado na quantidade de objetos existentes na cena. A Figura 7 mostra o gráfico que relaciona o número de divisões feitas na árvore com o número de testes para detectar a colisão entre 250 objetos. A região destacada em verde (Figura 6 (b)) se refere ao contador de testes de colisão executados em um determinado momento.Figura 6: Tela da aplicação onde foram executados os testes de desempenho. diferente do algoritmo de força bruta que teria um gráfico constante no número máximo possível de testes. O gráfico demonstra a grande diferença entre o algoritmo de força-bruta e o da quadtree. a linha do algoritmo da força-bruta aumenta de forma exponencial. porém. Figura 8: Número objetos por número de cálculos de colisão realizados. mesmo com a adição de uma grande quantidade de corpos. Figura 9: Uso da CPU e FPS por divisões da quadtree. Encerrando a análise temos o gráfico da Figura 9 demonstrando à utilização do processador e a taxa e quadros por segundo relacionadas com a quantidade de subdivisões realizadas no cenário. enquanto que a linha da quadtree cresce de uma forma discreta. a partir da terceira divisão do cenário a taxa de quadros cai drasticamente. quando foram feitas duas divisões a eficiência da quadtree atingiu seu ponto máximo. O teste foi realizado com 200 objetos em movimento sendo inseridos na quadtree.cenário a cada execução. e a utilização do processador aumenta em até 20%. Ao mesmo tempo foi capturado o número de cálculos de colisão realizado. . O gráfico mostra que o desempenho de uma quadtree está diretamente relacionado com o número de divisões no cenário. C. à medida que o número de subdivisões do cenário aumenta. C.br/~nonato/ED/ Novembro... www. S.usp..Com base nos resultados obtidos com os testes de desempenho de CPU. (2000). 1. o número de nós na árvore será dado pela ordem O(4 ) . n 6. apesar da redução do número de testes de colisão. Manocha.htm Agosto. Instituto de Ciências Matemáticas e de Computação http://www. Lin. Contudo. G. Luís G. ou seja. Boca Raton. Lin. se tivermos um número n de divisões.R. a demanda computacional exigida para manter a estrutura da árvore torna-se um problema grave. M. Evitando com isso que a recursão acesse um número muito grande de nós durante as operações de busca. Kimmerle. 2 ed. o algoritmo deve ser configurado de forma a obter o menor número de cálculos sem que isso comprometa a execução do sistema. estes avanços tornaram-se menos expressivos se for levada em consideração à exigência computacional das aplicações virtuais criadas nos últimos anos. Vol. fica claro que o algoritmo da quadtree reduz expressivamente o número de cálculos que precisam ser realizados entre pares de objetos na cena. (2004) Adaptive Medial-Axis Approximation for SphereTree Construction.icmc. D.. (2006) Quadtree. p 28.inf. Tipos e Estruturas de Dados .unisinos. Universidade do Vale do Rio dos Sinos (UNISINOS). . J. p18. RS. (2005) Tutorial: Real-Time Collision Detection for Dynamic Virtual Environments. quadros por segundo (fps) e número de testes de colisão. of the IEEE Virtual Reality. FL. Cohen. Ponamgi M. D. Conclusão A detecção de colisões é um campo que tem crescido cada vez na área de computação gráfica.Uma possível solução para a queda de desempenho da quadtree quando existe uma quantidade muito grande de nós na árvore é criar subdivisões dinamicamente baseado no número de objetos presentes no quadrante referente aquele nó. No. A. Nonato. se tivermos 3 divisões serão criados 64 sub-nós. In: Proc. se comparado com a quantidade de testes que é realizado pelo algoritmo de força-bruta. Manocha D.Quadtrees. K. University of North Carolina at Chapel Hill. Goetze. 23. Portanto. University of Tübingen. E apesar de todos os avanços tecnológicos realizados nos últimos anos na parte de hardware. In: CRC Handbook of Discrete and Computational Geometry.Este decréscimo abrupto no desempenho é porque o número de nós na árvore cresce exponencialmente em relação ao número de divisões. O’Sullivan. para n igual a 4 existirão 256 subnós. Referências Bradshaw.lcad.br/~ari/estrut/quad/Quadtree. In: Technical report. (1994) Interactive and Exact Collision Detection for Large-Scaled Environments. In: ACM Transactions. M. (2003) Collision and proximity queries. Portanto a quadtree deve ser utilizada baseada no contexto em que se aplica. Universidade do estado de Santa Catarina (UDESC). Texas. Detecção de colisão utilizando grids e octrees esféricas para ambientes gráficos interativos. L. R.S.com/QuadTree. F. Trabalho de conclusão de curso. . www.Rocha. p 103. (2007). Santos. EUA. DA S. Dissertação do Curso de Mestrado em Informática Aplicada da Universidade de Fortaleza. Ceará. Rodrigues M. (2007). (2004). (2005). Análise de Desempenho de Algoritmos para Detecção de Colisão em Ambientes Gráficos Interativos.html Agosto. Detecção de colisão para um simulador de robô manipulador. R. Taddeo. Quadtree design.G.heroicvirtuecreations. Universidade de Fortaleza (UNIFOR). D. Rose.A.
Report "Algoritmos para Detecção de Colisões em Ambientes Gráficos Bidimensionais"