Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Calcular 3D BackFace Culling

Iniciado por fiero, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

fiero

                                Hola,
Yo hasta ahora hacia el backface culling en 2D, pero voy a implementarlo en 3D para eliminar los poligonos desde el principio.

He buscado sobre el tema y las dos webs más claras son:

http://www.cubic.org/~submissive/sourcerer...er/backcull.htm

http://www.gamedev.net/reference/articles/...article1088.asp

Lo que he probado hasta ahora no me funciona del todo bien o es que no lo tengo del todo claro... Según decís es algún otro post (y tambien pensaba yo) basta con hacer un dot product entre el vector Z de la cámara y la normal del triángulo, pero tampoco me acaba de funcionar.

Según las webs anteriores hay que hacer dos operaciones por cada triángulo, una con un punto perteneciente al triángulo (un vertice) y otra con la cámara, y eso es lo que no entiendo.

¿Podriais indicarme algún otro tutorial o explicarme como lo haceis vosotros?

un saludo y gracias                                
www.videopanoramas.com Videopanoramas 3D player

CordayUK

                                yo no lo he probado pero segun pone en el tutorial de gamedev basta con hacer un dot product entre un vector desde la camara a cualquier punto del poligono, y la normal del poligono. Tiene todo el sentido del mundo vamos :sonriendo:

si no te funciona mira que ambos vectores han de estar normalizados.
                               

Drácula

                                No necesitas que los vectores estén Normalizados, puesto que lo único que quieres saber es el signo de la operación. Si el Producto escalar es <=0 entonces el triángulo no se ve. Tienes que usar la normal y luego un vector que vaya desde la cámara hasta un punto cualquiera del los tres que forman el triángulo.
Creo que lo que te digo es correcto, hace muuucho que no utilizo el BackFace Culling, porque precisamente me di cuenta de que no sirve para optimizar:son de esas cosas en las que te matas a optimizar y realmente no se gana nada, por lo menos esas han sido mis indagaciones sobre el BackFaceCulling en concreto.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

CordayUK

                                pues entonces lo de normalizar los vectores como dice drakula no hace falta, jejeje

yo es que nunca lo he hecho asi que no te puedo decir, era solo solo una idea. :sonriendo:

pero me gustaria que nos dijeras que es lo que falla cuando lo averigues, nos puede pasar a nosotros en el futuro...

                               

fiero

                                Ok, gracias por la aclaración, me habia liado porque en la primera web que he puesto se calcula de una forma más extraña.

saludos                                
www.videopanoramas.com Videopanoramas 3D player

fiero

                                jeje, hemos posteado clavaos!!!

Pues nada, resulta que lo que yo cogia era el vector hacia donde mira la cámara, pensando que es lo más lógico, pero esto no acababa de funcionar. Sin embargo, lo que hay que hacer es coger un vector desde el polígono hasta la cámara (como habeis dicho). De esta forma se pinta cualquier polígono que esté "de cara" a la cámara, aunque esté detrás de ésta, pero bueno, con el frustum se eliminan estos tambien....

saludos                                
www.videopanoramas.com Videopanoramas 3D player

Ithaqua

                                Hacer a mano el back-face culling con aceleradoras no tiene ningún sentido.
Creo recordar que fiero estaba haciendo un motor por soft, supongo que por eso irá la pregunta.
Puedes o bien hacer el dotproduct si trabajas en un sistema de coordenadas distinto al de cámara, o bien un simple if si trabajas en espacio de cámara.
El segundo caso es el más sencillo pero requiere que tus normales se hayan transformado a coordenadas de cámara. Lo único que haces es ver si la z de la normal mira hacia dentro o hacia fuera.
El primer caso requiere transformar el vector de vista de la cámara a coordenadas locales del objeto. Una vez hecho ésto se computa el producto escalar entre el vector de vista de la cámara y la normal de cada polígono para ver si encara (< 0) o no encara (>= 0) a la cámara.
Depende de cómo tengas estructurado tu motor uno hará menos operaciones que el otro.


                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

fiero

                                Gracias por la explicación Ithaqua. He optado por hacer el dot product entre un vertice y la pos de la camara y la normal del triángulo. Ésto lo meto en e bucle del frustum, así que sólo se calcula en los triángulos que están dentro de este:

      fld [ebx]punto3D.x
      fsub cam.x
      fmul [eax]normal.x
      fld [ebx]punto3D.y
      fsub cam.y
      fmul [eax]normal.y
      fadd
      fld [ebx]punto3D.z
      fsub cam.z
      fmul [eax]normal.z
      fadd
      fcomp zero
      fnstsw ax
      and ax,0x0100
      jnz nosevetriangulo

.

De todas formas, con el primer caso que explicas me evitaría 3 restas. Cuando dices vector "vista" de la cámara, ¿te refieres al vector Z de la cámara no?

un saludo

[ Este Mensaje fue editado por: fiero el 2002-09-11 19:23 ]                                
www.videopanoramas.com Videopanoramas 3D player

Ithaqua

                                Sí
                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org






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.