Frustum Culling

De Codepixel

El View Frustum es el volumen que define lo que es visible en la pantalla. El nombre define una pirámide, truncada por la punta, que se configura en función de la cámara.

Cuando enviamos un objeto a pintar, un descarte rápido es comprobar si su bbox está dentro del Frustum. Si está fuera, podemos descartar todo el objeto rápidamente, ya que será totalmente invisible.

[editar] Extracción de los planos

Con la matriz de proyección, podremos generar los 6 planos que forman el frustum. Para aplicaciones en tiempo real, podremos leer la matriz de proyección directamente del driver. La forma de extrar los planos es distinta en DirectX que en OpenGL.

[editar] Vértices del Frustum

Algo muy útil para depurar, o para monstrar la información, es tener una forma de mostrar los vértices del frustum, según sus planos (los cuales se pueden extraer de la matriz de proyección).

Definimos los 6 planos del frustum, usando la ecuación del plano :

left = lax + lby + lcz + ld = 0
right = rax + rby + rcz + rd = 0
bottom = bax + bby + bcz + bd = 0
top = tax + tby + tcz + td = 0
near = nax + nby + ncz + nd = 0
far = fax + fby + fcz + fd = 0

Primero, calculamos el valor de la Z , tanto de near como de far, recordando que la distancia del plano al origen es d. Y substituimos esos valores en las ecuaciones del plano. Para calcular la X, usamos la componente X de left/right, y lo mismo para calcular la Y, usando bottom/top. De este modo, las componentes quedan:

nz = − nc.nd
fz = − fc.fd
leftnear_x = - \frac { l_d + l_c . n_z }{l_a}
leftfar_x = - \frac { l_d + l_c . f_z }{l_a}
rightnear_x = - \frac { r_d + r_c . n_z }{r_a}
rightfar_x = - \frac { r_d + r_c . f_z }{r_a}
bottomnear_y = - \frac { b_d + b_c . n_z }{b_b}
bottomfar_y = - \frac { b_d + b_c . f_z }{b_b}
topnear_y = - \frac { t_d + t_c . n_z }{t_b}
topfar_y = - \frac { t_d + t_c . f_z }{t_b}

Las coordenadas de los vértices serán :

(leftnearx,bottomneary,nearz)
(rightnearx,bottomneary,nearz)
(leftnearx,topneary,nearz)
(rightnearx,topneary,nearz)
(leftfarx,bottomfary,farz)
(rightfarx,bottomfary,farz)
(leftfarx,topfary,farz)
(rightfarx,topfary,farz)

De todos modos, si estamos en una aplicación en tiempo real, podemos multiplicar las coordenadas de un cubo unidad, por la inversa de la matriz de proyección.

[editar] Enlaces

Herramientas personales
Navegación
Herramientas