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





Comentarios (1)



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.