Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: 1cacalvo en 29 de Febrero de 2008, 10:12:38 AM

Título: Algebra planos
Publicado por: 1cacalvo en 29 de Febrero de 2008, 10:12:38 AM
Estoy documentando sobre el Frustum Culling y bueno no parece muy complicado pero mi problema viene al definir los 6 planos de corte.
He visto la implementación de como se consiguen pero no he conseguido encontrar en San GOOGLE la explicación algebraica del porque...

Si teneis algun doc o similar pues estaria agradecido...



MD = GL_MODELVIEW_MATRIX
PROY = GL_PROJECTION_MATRIX

clip[0] = md[0] * proj[0] + md[1] * proj[4] + md[2] * proj[8]  + md[3] * proj[12];
clip[1] = md[0] * proj[1] + md[1] * proj[5] + md[2] * proj[9]  + md[3] * proj[13];
clip[2] = md[0] * proj[2] + md[1] * proj[6] + md[2] * proj[10] + md[3] * proj[14];
clip[3] = md[0] * proj[3] + md[1] * proj[7] + md[2] * proj[11] + md[3] * proj[15];

clip[4] = md[4] * proj[0] + md[5] * proj[4] + md[6] * proj[8]  + md[7] * proj[12];
clip[5] = md[4] * proj[1] + md[5] * proj[5] + md[6] * proj[9]  + md[7] * proj[13];
clip[6] = md[4] * proj[2] + md[5] * proj[6] + md[6] * proj[10] + md[7] * proj[14];
clip[7] = md[4] * proj[3] + md[5] * proj[7] + md[6] * proj[11] + md[7] * proj[15];

clip[8]  = md[8] * proj[0] + md[9] * proj[4] + md[10] * proj[8]  + md[11] * proj[12];
clip[9]  = md[8] * proj[1] + md[9] * proj[5] + md[10] * proj[9]  + md[11] * proj[13];
clip[10] = md[8] * proj[2] + md[9] * proj[6] + md[10] * proj[10] + md[11] * proj[14];
clip[11] = md[8] * proj[3] + md[9] * proj[7] + md[10] * proj[11] + md[11] * proj[15];

clip[12] = md[12] * proj[0] + md[13] * proj[4] + md[14] * proj[8]  + md[15] * proj[12];
clip[13] = md[12] * proj[1] + md[13] * proj[5] + md[14] * proj[9]  + md[15] * proj[13];
clip[14] = md[12] * proj[2] + md[13] * proj[6] + md[14] * proj[10] + md[15] * proj[14];
clip[15] = md[12] * proj[3] + md[13] * proj[7] + md[14] * proj[11] + md[15] * proj[15];


// Calculate the right side of the frustum.
  Frustum[0].a = clip[3]  - clip[0];
Frustum[0].b = clip[7]  - clip[4];
Frustum[0].c = clip[11] - clip[8];
Frustum[0].d = clip[15] - clip[12];

// Calculate the left side of the frustum.
Frustum[1].a = clip[3]  + clip[0];
Frustum[1].b = clip[7]  + clip[4];
Frustum[1].c = clip[11] + clip[8];
Frustum[1].d = clip[15] + clip[12];

// Calculate the bottom side of the frustum.
Frustum[2].a = clip[3]  + clip[1];
Frustum[2].b = clip[7]  + clip[5];
Frustum[2].c = clip[11] + clip[9];
Frustum[2].d = clip[15] + clip[13];

// Calculate the top side of the frustum.
Frustum[3].a = clip[3]  - clip[1];
Frustum[3].b = clip[7]  - clip[5];
Frustum[3].c = clip[11] - clip[9];
Frustum[3].d = clip[15] - clip[13];

// Calculate the far side of the frustum.
Frustum[4].a = clip[3]  - clip[2];
Frustum[4].b = clip[7]  - clip[6];
Frustum[4].c = clip[11] - clip[10];
Frustum[4].d = clip[15] - clip[14];

// Calculate the near side of the frustum.
Frustum[5].a = clip[3]  + clip[2];
Frustum[5].b = clip[7]  + clip[6];
Frustum[5].c = clip[11] + clip[10];
Frustum[5].d = clip[15] + clip[14];
Título: Algebra planos
Publicado por: BeRSeRKeR en 29 de Febrero de 2008, 04:25:16 PM
¿Has probado con el documento de Hartman y Gribb (http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf)?

Aunque la implementación que tienes se parece a la que describe en el paper, por lo que es posible que sí lo hayas leído.

Saludos.
Título: Algebra planos
Publicado por: 1cacalvo en 03 de Marzo de 2008, 09:44:03 AM
Muchas gracias no habia leido el paper, pero esta perfectamente explicado...