Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





scene graph, bsp, quadtree, octree ...

Iniciado por Morpheo, 24 de Septiembre de 2006, 04:51:12 PM

« anterior - próximo »

Morpheo

Hola a todos. Siempre me han interesado los motores graficos y la manera en que estan hechos. Habia leido algunas cosas, pero hace poco que me he puesto en serio con ello. Aunque aun sigo muy verde.

He estado leyendo sobre scene graph, quadtree, octree, etc y esto me ha planteado algunas dudas. Si alguno pudiera resolvermelas o indicarme donde puedo encontrar la solucion se lo agradeceria mucho. Mis dudas son:

1.- ¿Se puede hacer que un nodo del scene graph sea un escenario representado por un quadtree, octree o alguna de las otras tecnicas?

2.- ¿Como afecta esto a la deteccion de colisiones?

Gracias a todos.

zupervaca

Me imagino que estaras programando en c++, si es asi te recomiendo crear una clase base (haria de nodo) que "sepa" como trabajar de forma muy generica con todos los tipos que mencionas, es decir:


class base
{
public:
   virtual void pintar() = 0;
   virtual void actualiza() = 0;
   virtual void agregaobjeto() = 0;
   virtual void agregarnodohermano() = 0;
   ...
   int numNodos;
   base* nodos;
}

class scenegraph : public base
{
...
}

class quadtree : public base
...

Es otro ejemplo cutre de los mios, pero te espero que te hagas una idea de por donde van los tiros.
Sobre las colisiones pues lo mismo, una funcion virtual para comprobar colisiones, a ser posible que sea de clase base contra clase base, es decir:

class base
{
   // Todo lo de antes
   ...

   virtual bool colision( base* contra );
}

Aunque esto depende mas de como quieras hacer las colisiones, si es de bounding box por ejemplo podrias hacer esto otro:

class base
{
public:
   ...
   bool colision( bbox* contra )
   {
       return this->obtenerbbox().estadentro(contra);
   }

   bool colisionbbox( base* contra )
   {
       return this->colision( contra->obtenerbbox() );
   }

   virtual bbox* obtenerbbox() = 0;
   ...
}

class scenegraph : public base
{
public:
   bbox* obtenerbbox()
   {
       // Podemos tenerlo precalculado
       return this->bbox;
   }
}


Espero haberte ayudado  :wink:

PD: Todo depende de cuantas clases y capas quieras tener en tu motor.

Editado: Los modelos de personajes, objetos, etc deberia derivar de la clase "base" o de otra que derive de esta, tambien deberias ir pensando en poner flags tipo: "se puede mover", "esta animado", "su tamaño cambia", etc.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.