Octree – Wikipédia, a enciclopédia livre

Exemplo de Octree.

Uma Octree (Oct + Tree ou árvore de oito) é uma árvore, onde cada nó que não seja folha possui interligação com mais outros oito nós da estrutura de dados, esta interligação se faz normalmente por meio de ponteiros. A Octree é uma técnica de modelagem bastante comum no uso de tratamento de colisões.

Descrição[editar | editar código-fonte]

Uma esfera modelada com profundidade 7.

Basicamente definimos uma bounding box, ou caixa delimitadora onde nosso algoritmo atuará e dentro dos limites desta caixa está a primitiva ou cenário que desejamos modelar. O espaço é então dividido em oito partes iguais, e verificamos se existe intersecção desta primitiva ou cenário com cada um dos hexaedros resultantes da divisão.

Caso não ocorra intersecção deixamos o cubo resultante em branco ou vazio. se houver intersecção há duas possibilidades: caso o hexaedro esteja completamente inserido na primitiva ou cenário, pintamos o hexaedro para que seja exibido na tela; caso o hexaedro esteja parcialmente inserido na primitiva, dividimos este por sua vez em mais oito partes menores e repetimos o algoritmo até que profundidade máxima de nossa árvore seja alcançada ou a primitiva ou cenário sejam modelados por completo. Também é possível usarmos algum algoritmo de corte da árvore, de forma a torná-la menor e mais eficiente.

Quando tratamos com Octrees estamos sempre nos referindo ao espaço tridimensional, caso desejamos dividir o espaço bidimensional, como uma figura em uma plano cartersiano poderemos usar a Quadtree, onde dividimos o espaço por quatro partes iguais ao invés de oito.

Implementação[editar | editar código-fonte]

Exemplo de algoritmo de Octree em C:

void constroi_OCT(Tesfera e, Toctree *filho, GLint profundidade){  /*montar arvore*/  Toctree *pai;  char estado;  int i;   pai=filho;  estado='B';  if (profundidade>1)  estado=classifica_esfera(e, (*pai).coordenadas, (*pai).lado);  (*pai).estado=estado;   if (estado=='('){  subdivide(pai);  for (i=0;i<8;i++)   constroi_OCT(e, (*pai).filhos[i],profundidade-1);  } } 

Representação[editar | editar código-fonte]

Uma maneira comum de descrevermos uma Octree é através de uma representação DF (Depth First, profundidade primeiro). Por exemplo, usando B para blocos cheios (Black), W para blocos vazios (White) e ( para blocos parciais poderíamos descrever a figura apresentada no topo deste artigo através da linha:

Ligações externas[editar | editar código-fonte]

Ícone de esboço Este artigo sobre computação gráfica é um esboço. Você pode ajudar a Wikipédia expandindo-o.