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.htmhttp://www.gamedev.net/reference/articles/...article1088.aspLo 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
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.
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.
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...
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
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
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.
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 ]
Sí