tgFrustum.cpp
Go to the documentation of this file.
00001 
00002 #include <blort/TomGine/tgFrustum.h>
00003 
00004 using namespace TomGine;
00005 
00006 void tgFrustum::ExtractFrustum(){
00007         float   clip[16];
00008         float   t;
00009         float mv[16];
00010         float pj[16];
00011  
00012         /* Get the current PROJECTION matrix from OpenGL */
00013         glGetFloatv( GL_PROJECTION_MATRIX, pj );
00014  
00015         /* Get the current MODELVIEW matrix from OpenGL */
00016         glGetFloatv( GL_MODELVIEW_MATRIX, mv );
00017         
00018         m_intrinsic = mat4(pj);
00019         m_extrinsic = mat4(mv);
00020  
00021         /* Combine the two matrices (multiply projection by modelview) */
00022         clip[ 0] = mv[ 0] * pj[ 0] + mv[ 1] * pj[ 4] + mv[ 2] * pj[ 8] + mv[ 3] * pj[12];
00023         clip[ 1] = mv[ 0] * pj[ 1] + mv[ 1] * pj[ 5] + mv[ 2] * pj[ 9] + mv[ 3] * pj[13];
00024         clip[ 2] = mv[ 0] * pj[ 2] + mv[ 1] * pj[ 6] + mv[ 2] * pj[10] + mv[ 3] * pj[14];
00025         clip[ 3] = mv[ 0] * pj[ 3] + mv[ 1] * pj[ 7] + mv[ 2] * pj[11] + mv[ 3] * pj[15];
00026  
00027         clip[ 4] = mv[ 4] * pj[ 0] + mv[ 5] * pj[ 4] + mv[ 6] * pj[ 8] + mv[ 7] * pj[12];
00028         clip[ 5] = mv[ 4] * pj[ 1] + mv[ 5] * pj[ 5] + mv[ 6] * pj[ 9] + mv[ 7] * pj[13];
00029         clip[ 6] = mv[ 4] * pj[ 2] + mv[ 5] * pj[ 6] + mv[ 6] * pj[10] + mv[ 7] * pj[14];
00030         clip[ 7] = mv[ 4] * pj[ 3] + mv[ 5] * pj[ 7] + mv[ 6] * pj[11] + mv[ 7] * pj[15];
00031  
00032         clip[ 8] = mv[ 8] * pj[ 0] + mv[ 9] * pj[ 4] + mv[10] * pj[ 8] + mv[11] * pj[12];
00033         clip[ 9] = mv[ 8] * pj[ 1] + mv[ 9] * pj[ 5] + mv[10] * pj[ 9] + mv[11] * pj[13];
00034         clip[10] = mv[ 8] * pj[ 2] + mv[ 9] * pj[ 6] + mv[10] * pj[10] + mv[11] * pj[14];
00035         clip[11] = mv[ 8] * pj[ 3] + mv[ 9] * pj[ 7] + mv[10] * pj[11] + mv[11] * pj[15];
00036  
00037         clip[12] = mv[12] * pj[ 0] + mv[13] * pj[ 4] + mv[14] * pj[ 8] + mv[15] * pj[12];
00038         clip[13] = mv[12] * pj[ 1] + mv[13] * pj[ 5] + mv[14] * pj[ 9] + mv[15] * pj[13];
00039         clip[14] = mv[12] * pj[ 2] + mv[13] * pj[ 6] + mv[14] * pj[10] + mv[15] * pj[14];
00040         clip[15] = mv[12] * pj[ 3] + mv[13] * pj[ 7] + mv[14] * pj[11] + mv[15] * pj[15];
00041  
00042         /* Extract the numbers for the RIGHT plane */
00043         frustum[0][0] = clip[ 3] - clip[ 0];
00044         frustum[0][1] = clip[ 7] - clip[ 4];
00045         frustum[0][2] = clip[11] - clip[ 8];
00046         frustum[0][3] = clip[15] - clip[12];
00047  
00048         /* Normalize the result */
00049         t = sqrt( frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] + frustum[0][2] * frustum[0][2] );
00050         frustum[0][0] /= t;
00051         frustum[0][1] /= t;
00052         frustum[0][2] /= t;
00053         frustum[0][3] /= t;
00054  
00055         /* Extract the numbers for the LEFT plane */
00056         frustum[1][0] = clip[ 3] + clip[ 0];
00057         frustum[1][1] = clip[ 7] + clip[ 4];
00058         frustum[1][2] = clip[11] + clip[ 8];
00059         frustum[1][3] = clip[15] + clip[12];
00060  
00061         /* Normalize the result */
00062         t = sqrt( frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] + frustum[1][2] * frustum[1][2] );
00063         frustum[1][0] /= t;
00064         frustum[1][1] /= t;
00065         frustum[1][2] /= t;
00066         frustum[1][3] /= t;
00067  
00068         /* Extract the BOTTOM plane */
00069         frustum[2][0] = clip[ 3] + clip[ 1];
00070         frustum[2][1] = clip[ 7] + clip[ 5];
00071         frustum[2][2] = clip[11] + clip[ 9];
00072         frustum[2][3] = clip[15] + clip[13];
00073  
00074         /* Normalize the result */
00075         t = sqrt( frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] + frustum[2][2] * frustum[2][2] );
00076         frustum[2][0] /= t;
00077         frustum[2][1] /= t;
00078         frustum[2][2] /= t;
00079         frustum[2][3] /= t;
00080  
00081         /* Extract the TOP plane */
00082         frustum[3][0] = clip[ 3] - clip[ 1];
00083         frustum[3][1] = clip[ 7] - clip[ 5];
00084         frustum[3][2] = clip[11] - clip[ 9];
00085         frustum[3][3] = clip[15] - clip[13];
00086  
00087         /* Normalize the result */
00088         t = sqrt( frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] + frustum[3][2] * frustum[3][2] );
00089         frustum[3][0] /= t;
00090         frustum[3][1] /= t;
00091         frustum[3][2] /= t;
00092         frustum[3][3] /= t;
00093  
00094         /* Extract the FAR plane */
00095         frustum[4][0] = clip[ 3] - clip[ 2];
00096         frustum[4][1] = clip[ 7] - clip[ 6];
00097         frustum[4][2] = clip[11] - clip[10];
00098         frustum[4][3] = clip[15] - clip[14];
00099  
00100         /* Normalize the result */
00101         t = sqrt( frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] + frustum[4][2] * frustum[4][2] );
00102         frustum[4][0] /= t;
00103         frustum[4][1] /= t;
00104         frustum[4][2] /= t;
00105         frustum[4][3] /= t;
00106  
00107         /* Extract the NEAR plane */
00108         frustum[5][0] = clip[ 3] + clip[ 2];
00109         frustum[5][1] = clip[ 7] + clip[ 6];
00110         frustum[5][2] = clip[11] + clip[10];
00111         frustum[5][3] = clip[15] + clip[14];
00112  
00113         /* Normalize the result */
00114         t = sqrt( frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] + frustum[5][2] * frustum[5][2] );
00115         frustum[5][0] /= t;
00116         frustum[5][1] /= t;
00117         frustum[5][2] /= t;
00118         frustum[5][3] /= t;
00119 }
00120 
00121 bool tgFrustum::PointInFrustum( float x, float y, float z ){
00122         int p;
00123  
00124         for( p = 0; p < 6; p++ ){
00125                 if( frustum[p][0] * x + frustum[p][1] * y + frustum[p][2] * z + frustum[p][3] <= 0 )
00126                         return false;
00127         }
00128                         
00129         return true;
00130 }
00131 
00132 bool tgFrustum::SphereInFrustum( float x, float y, float z, float radius ){
00133         int p;
00134  
00135         for( p = 0; p < 6; p++ ){
00136                 if( frustum[p][0] * x + frustum[p][1] * y + frustum[p][2] * z + frustum[p][3] <= -radius )
00137                         return false;
00138         }
00139         return true;
00140 }
00141 
00142 void tgFrustum::DrawFrustum(){
00143  
00144 // Get near and far from the Projection matrix.
00145         float depthRange[2];
00146         glGetFloatv(GL_DEPTH_RANGE, &depthRange[0]);
00147         float near = -depthRange[0]; //1.0 * m_intrinsic[11] / (m_intrinsic[10] - 1.0);
00148         float far = -depthRange[1]; //-1.0 * m_intrinsic[11] / (1.0 + m_intrinsic[10]);
00149  
00150         // Get the sides of the near plane.
00151         const float nLeft = near * (m_intrinsic[2] - 1.0f) / m_intrinsic[0];
00152         const float nRight = near * (1.0f + m_intrinsic[2]) / m_intrinsic[0];
00153         const float nTop = near * (1.0f + m_intrinsic[6]) / m_intrinsic[5];
00154         const float nBottom = near * (m_intrinsic[6] - 1.0f) / m_intrinsic[5];
00155  
00156         // Get the sides of the far plane.
00157         const float fLeft = far * (m_intrinsic[2] - 1.0f) / m_intrinsic[0];
00158         const float fRight = far * (1.0f + m_intrinsic[2]) / m_intrinsic[0];
00159         const float fTop = far * (1.0f + m_intrinsic[6]) / m_intrinsic[5];
00160         const float fBottom = far * (m_intrinsic[6] - 1.0f) / m_intrinsic[5];
00161  
00162         /*
00163          0      glVertex3f(0.0f, 0.0f, 0.0f);
00164          1      glVertex3f(nLeft, nBottom, -near);
00165          2      glVertex3f(nRight, nBottom, -near);
00166          3      glVertex3f(nRight, nTop, -near);
00167          4      glVertex3f(nLeft, nTop, -near);
00168          5      glVertex3f(fLeft, fBottom, -far);
00169          6      glVertex3f(fRight, fBottom, -far);
00170          7      glVertex3f(fRight, fTop, -far);
00171          8      glVertex3f(fLeft, fTop, -far);
00172          */
00173         glDisable(GL_LIGHTING);
00174         glDisable(GL_TEXTURE_2D);
00175 
00176 
00177         glMatrixMode(GL_MODELVIEW);
00178 
00179         glPushMatrix();
00180         glBegin(GL_LINES);
00181  
00182                 glVertex3f(nLeft, nBottom, -near);
00183                 glVertex3f(fLeft, fBottom, -far);
00184         
00185                 glVertex3f(nRight, nBottom, -near);
00186                 glVertex3f(fRight, fBottom, -far);
00187         
00188                 glVertex3f(nRight, nTop, -near);
00189                 glVertex3f(fRight, fTop, -far);
00190         
00191                 glVertex3f(nLeft, nTop, -near);
00192                 glVertex3f(fLeft, fTop, -far);
00193         
00194                 //far
00195                 glVertex3f(fLeft, fBottom, -far);
00196                 glVertex3f(fRight, fBottom, -far);
00197         
00198                 glVertex3f(fRight, fTop, -far);
00199                 glVertex3f(fLeft, fTop, -far);
00200         
00201                 glVertex3f(fRight, fTop, -far);
00202                 glVertex3f(fRight, fBottom, -far);
00203         
00204                 glVertex3f(fLeft, fTop, -far);
00205                 glVertex3f(fLeft, fBottom, -far);
00206         
00207                 //near
00208                 glVertex3f(nLeft, nBottom, -near);
00209                 glVertex3f(nRight, nBottom, -near);
00210         
00211                 glVertex3f(nRight, nTop, -near);
00212                 glVertex3f(nLeft, nTop, -near);
00213         
00214                 glVertex3f(nLeft, nTop, -near);
00215                 glVertex3f(nLeft, nBottom, -near);
00216         
00217                 glVertex3f(nRight, nTop, -near);
00218                 glVertex3f(nRight, nBottom, -near);
00219         
00220         glEnd();
00221         glPopMatrix();
00222 }
00223 


blort
Author(s): Michael Zillich, Thomas Mörwald, Johann Prankl, Andreas Richtsfeld, Bence Magyar (ROS version)
autogenerated on Thu Jan 2 2014 11:38:26