VirtualWorlds – O problema final da visibilidade

Pelo menos eu espero que esse seja o fim das regras de determinação de visibilidade. Esse conjunto de regras é conhecido, no jargão da matemática, como PVS (Potentially Visible Set – ou, “Conjunto potencialmente visível”).

O problema que resta é a tentativa de aumentar a precisão dos testes de visibilidade particionando os testes. Ou seja, criando listas de  bounding spheres, boxes e elipsóides para um único objeto complexo. Essa técnica é usada em jogos 2D, como mostra a figura abaixo:

Bounding boxes dierentes para o mesmo modelo, em posições diferentes. Em 2D.

Com listas de bounding boxes para certas posições evitamos os testes de grandes espaços vazios, se usássemos apenas uma caixa.

É claro que, no nosso caso, vale a pena fazer isso, com moderação, para todos os testes. Criar listas de esferas para o modelo inteiro, listas de aabboxes e listas de elipsóides. Seguindo a mesma sequência de testes que mostrei no post anterior, se todos os testes esfericos retornarem falso (zero), então descartamos o objeto inteiro, senão, se todos os testes de aabboxes retornarem falso (zero), então descartamos o objeto… a mesma coisa para os testes de elipsóides. Esses 3 testes são feitos pelas funções planeTestSphere, planeTestAABBox e planeTestEllipsoid, mostradas nos posts anteriores.

Não podemos ter, contudo, muitas esferas, aabboxes e elipsóides, porque senão seria melhor verificar todos os vértices do objeto e esses testes perderiam todo o sentido de existirem…

Um esboço da estrutura que contém o objeto seria essa:

/* Toda esfera tem um centro e um raio */
struct sphere_s
{
  float center[3];
  float radius;
};

/* Toda elipsóide tem 3 vetores e um centro */
struct ellipsoid_s
{
  float center[3];
  float vectors[3][3];
};

struct object_s
{
  int numVertices;
  int numBoundingSpheres;
  int numAABBoxes;   /* calculado em realtime. */
  int numEllipsoids;
  /* ... Outros atributos aqui ... */

  float (*vertices)[3];
  struct sphere_s *boundingSpheres;
  float (*aabboxes)[2][3];  /* alocado e calculado em realtime */
  struct ellipsoid_s *boundingEllipsoids;
  /* ... Outras listas aqui ... */
};

Note que o número de AABBoxes e as coordenadas dessas caixas devem ser calculadas em realtime por causa daquele problema de rotação… Só devo lembrar que nós precisamos das AABBoxes por que elas são mais rápidas do que usar elipsóides!

Não vou mostrar as rotinas que lidam com essas estruturas porque são bastante óbvias. Mais óbvio ainda que esses testes são feitos todos contra um plano, que pode ser o de um frustum ou de um plano divisor vindo da BSP Tree.

Vocẽ deve ter notado que não usei os containers da STL. Eu poderia muito bem usar o template vector e poupar o trabalho de manipular os buffers contendo os vetores, esferas, aabboxes e elipsóides, manualmente… Acontece que estou desenvolvendo esse framework totalmente em C e de forma otimizada (medindo ciclos, usando SSE quando possível, etc). C++ é prático, fácil, mas não é performático.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s