Sacado de mmadrigal.com.
Monthly Archives: November 2010
Backface culling en Processing
Lo más probable es que buscando cómo ocultar las caras de los polígonos que no están orientados hacia nosotros en Processing, se llege a la página http://wiki.processing.org/w/Backface_culling; curiosa página que no resuelve la duda, ya que indica que “se puede activar” pero no indica cómo.
Una parte de la solución está en la página, en la sección de tutoriales en la misma wiki, de “OpenGL Avanzado”: http://wiki.processing.org/w/Advanced_OpenGL
La solución, para que no haya que pensar mucho, es esta:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import processing.opengl.*; import javax.media.opengl.*; // Para backface culling GL gl; void setup() { size(200,200,OPENGL); gl = ((PGraphicsOpenGL)g).beginGL(); gl.glEnable(GL.GL_CULL_FACE); gl.glCullFace(GL.GL_FRONT); } void draw() { } |
Para activar y desactivar el backface culling se utiliza:
1 2 |
gl.glEnable(GL.GL_CULL_FACE); gl.glDisable(GL.GL_CULL_FACE); |
Para cambiar el tipo de ocultación entre la cara frontal y la trasera:
1 2 |
gl.glCullFace(GL.GL_FRONT); gl.glCullFace(GL.GL_BACK); |
ATENCIÓN: por experiencia propia, Processing parece no funcionar bien como mínimo con texturas porque cambia el orden de dibujado de vértices, lo que hace que la cara frontal o trasera no pueda ser definida al gusto personal. Es decir, la frontal y la trasera, mágicamente, siempre es la misma :(
Ejes 3D en Processing
En el lenguaje Processing, los ejes X, Y y Z son los siguientes con el centro de coordenadas en la esquina superior izquierda de la pantalla:
- X positiva hacia la derecha
- Y positiva hacia abajo
- Z positiva hacia fuera de la pantalla
A menudo se me olvida el sentido de la Z, así que aquí pongo una imagen extraída de este tutorial, en la que se indica el sentido de -Z:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import processing.opengl.*; size(200,200,OPENGL) ; fill(0,0,255) ; rect(50,50,100,100) ; pushMatrix() ; translate(100,100,-50); fill(0,255,0) ; box(40) ; popMatrix() ; pushMatrix() ; translate(100,100,50) ; fill(255,0,0) ; box(40) ; popMatrix() ; |
Este programa dibuja un rectángulo azul como base en Z=0, un cubo verde en la coordenada Z=-50 , y un cubo rojo en la coordenada Z=50 . El cubo rojo es el que se ve, por lo tanto, la Z positiva “hacia fuera del monitor”.
La explicación más aclaratoria es: en processing el producto vectorial de X por Y es -Z (se puede ver según la regla de la mano derecha).
Espero que ahora no se me vuelva a olvidar…