Frustum Culling

Método SphereIn


| Frustum::EFrustumCol Frustum::SphereIn(Vector3 &v3Center, float fRadius)
| {
| float fDistance;
|
| // Calculamos la distancia a cada uno de los planos
| // Debug: Sólo chequeo plano izquierdo
| for(int i=0; i<6; i++)
| {
| const Vector3 * pNormal = m_plane[0].GetNormal();
|
| // Buscamos la distancia de la esfera al plano
| fDistance = m_plane[i].GetPointDistance(v3Center);
|
| // Si la distancia es < -sphere.radius, entonces estamos fuera
| // del frustum
| if (fDistance < -fRadius)
| return out; // out
|
| // Si la distancia está entre +- el radio, entonces interseca
| if (fabs(fDistance) < fRadius)
| return intersect; // intersect
| }
|
| // De otro modo, estamos dentro
| return in; // in
| }

Método BoxIn


| Frustum::EFrustumCol Frustum::BoxIn(Vector3 * pVerts, int iCount)
| {
| int iTotalIn = 0;
| int iInCount = 8;
| int iPtIn = 1;
|
| for(int p=0; p<6; p++)
| {
| iInCount = iCount;
| iPtIn = 1;
|
| for(int i=0; i<iCount; i++)
| {
| // Probamos el punto contra todos los planos
| if (m_plane[p].ClassifyPoint(pVerts[i]) == Plane::CP_BACK)
| {
| iPtIn = 0;
| --iInCount;
| }
| }
|
| // ¿Están todos los puntos fuera?
| if (iInCount == 0)
| return out;
|
| // Sumo la cantidad de puntos dentro del plano
| iTotalIn += iPtIn;
| }
|
| // Si todos los puntos están dentro, entonces la caja
| // está dentro del frustum
| if (iTotalIn == 6)
| return in;
|
| // La caja está parte dentro del plano
| return intersect;
| }

Bibliografía

Fast Extraction of Viewing Frustum Planes from the World-
View-Projection Matrix – Gil Gribb y Klaus Hartmann

3D Game Engine Design – David H. Eberry – (Cap. 4 – Hierarchical Scene Representations)

~fuzzyLogic

Compartir:
  • Twitter
  • Facebook
  • MySpace
  • BarraPunto
  • del.icio.us

Pages: 1 2 3 4 5

Comments

  1. May 1st, 2007 | 5:39

    En el algortimo del test del bbox hay un fallo:
    –iInCount; debería ser -–iInCount;

    Muy buen tutorial, me ha gustado especialmente la parte en la que extraes los planos del frustrum de la matriz, nunca había visto la demostración matemática.

Leave a reply