Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Determinar La Silueta

Iniciado por Marci, 21 de Mayo de 2006, 07:39:45 PM

« anterior - próximo »

Marci

 Hola, he estado mirando como determinar la silueta de un objeto a la hora de calcular las sombras de una escena. Hasta ahora estaba empleando el metodo conocido como fuerza bruta recorriendo todos los triangulos de la malla en cada frame. Googleando un poco he encontrado dos metodos que tiene buena pinta:

Gauss Map Arc Hierarchy: ¿Solo vale para proyección ortografica?
Normal Cone Hierarchy: ¿Bastante complejo?

¿Alguien los conoce o tiene implementados? ¿Me recomendais algún otro metodo?

Pogacha

 Bueno, no conozco esos metodos, pero la solución para elementos estaticos es el precalculo (SVBSP en su mejor caso), y para elementos dinamicos, la estructura del (medio) borde, con ella solo determinas si cada cara esta en frente o detras de la luz, luego recorres los (medios) bordes y determinas si tan solo una de las caras que apuntas esta de frente.

Supongo que algún metodo de esos podrá aprovechar alguna transitividad entre siluetas (ya que son continuas y cerradas ), pero mis conocimientos llegan hasta ahí.

Saludos.

zupervaca

 Si quieres un sistema para renderizar la silueta de un objeto sobre el mismo puedes usar un truco en el que no usas la cpu, consiste en renderizar el modelo escalandolo un poco y en el sentido contrario al que lo renderizaste, ademas debes de renderizarlo sin texturas y con color negro, es el mismo efecto que hago en el dibMotor de hace unos añucos, de esta manera en ordenadores lentorros no comia velocidad este efecto.

Marci

 
Cita de: " Pogacha @ 22/05/06"para elementos dinamicos, la estructura del (medio) borde, con ella solo determinas si cada cara esta en frente o detras de la luz, luego recorres los (medios) bordes y determinas si tan solo una de las caras que apuntas esta de frente
Asi es como lo estoy haciendo ahora pero es muy lento. En cada frame tengo que recorrer todos los triangulos de la malla para sacar la silueta :(

Cita de: " zupervaca @ 22/05/06"Si quieres un sistema para renderizar la silueta de un objeto sobre el mismo puedes usar un truco en el que no usas la cpu, consiste en renderizar el modelo escalandolo un poco y en el sentido contrario al que lo renderizaste, ademas debes de renderizarlo sin texturas y con color negro, es el mismo efecto que hago en el dibMotor de hace unos añucos, de esta manera en ordenadores lentorros no comia velocidad este efecto.
No necesito renderizar la silueta sino conocer los vertices que la componen para poder proyectar la sombra

AK47

 Puedes usar la GPU para ello, creo. Mirate la web de nVidia o ATI, hay ejemplos de como implementar las sombras stencil por hardware :)

Pogacha

 Estube pensando en este problema y se me ocurri� una soluci�n que puede funcionar ... ( y voy a patentar :P )

Aprovechando que la silueta es cerrada y mono-area ( cualquier punto dentro del area proyectada se conecta con mas de dos punto del mismo area y no tiene islas o huecos ), la silueta se puede perseguir dinamicamente!

Cada borde guarda referencia a 2 vertices, a 2 caras y dos referencias a listas circulares de referencias a bordes que utilizan a cada vertice respectivamente.

struct Borde {
 Vertice *VA, *VB;
 Cara *CA, *CB;
 BordePtr *BA, *BB;
};

BordePtr ListasCirculares[n_Bordes];


Determinando la silueta:

1 - Encuentro un borde de la silueta ( dinamicamente empiezo a recorrer los bordes por el ultimo borde del frame anterior ;) )

2 - Agrego este borde a la lista de bordes de la silueta, tomo la referencia al elemento de la lista circular de referencias a bordes,

3 - Recorro esta lista circular hasta dar con el borde que pertenece a la silueta, cambio la referencia del borde original para que apunte a este quien tendr� mas posibilidades de ser silueta en el proximo frame!

4 - Tomo este borde y loopeo a 2 hasta llegar al origen nuevamente.

Lo estoy patentando en este momento  :lol:  

AgeR

 Caramba, pues es curioso pero estuve pensando a partir del post en una forma de ahorrar cálculo a la hora de obtener la nueva silueta, y básicamente había llegado a la misma idea que Pogacha acaba de describir.  :huh:

Venga va, te cedo la patente  :lol: .

Pogacha

 Si, pero no anda ... un mismo cuerpo no convexo puede tener mas de una silueta (curva cerrada) y todavia no se me ocurre como solucionarlo sin tener que recorrer todos los bordes :( ...

Habría que refinar eso tan solo, o trabajar con cuerpos convexos  :P