View Frustum Vertices / Corners

Started by
3 comments, last by portable 18 years, 7 months ago
Hei! I want to render the view frustum I created with glFrustum. Thus I'd need all the vertices which define it in world space. My idea was to use the CameraToWorld-Matrix (the inverse of the GL_MODELVIEW_MATRIX in my case) and multiply it with the vertices defined by glFrustum. But this did not work! Does anybody know why? Thanks in advance, Phil
Advertisement
Can you post your code? I can think of a couple places where things could be going wrong, but I couldn't say for sure without seeing it.
O.k., here we go. The matrix inversion should be correct. I'm using the one provided on the INTEL-Web-Site.

void multMatrixVector( float mat[ 16 ], float vec[ 4 ], float* res ){	res[ 0 ] = mat[  0 ] * vec[ 0 ] + mat[  1 ] * vec[ 1 ] + mat[  2 ] * vec[ 2 ] + mat[  3 ] * vec[ 3 ];	res[ 1 ] = mat[  4 ] * vec[ 0 ] + mat[  5 ] * vec[ 1 ] + mat[  6 ] * vec[ 2 ] + mat[  7 ] * vec[ 3 ];	res[ 2 ] = mat[  8 ] * vec[ 0 ] + mat[  9 ] * vec[ 1 ] + mat[ 10 ] * vec[ 2 ] + mat[ 11 ] * vec[ 3 ];	res[ 3 ] = mat[ 12 ] * vec[ 0 ] + mat[ 13 ] * vec[ 1 ] + mat[ 14 ] * vec[ 2 ] + mat[ 15 ] * vec[ 3 ];}static void draw_screen( void ){    static GLint vertices[ 24 ] = { -1, -1, -1, -1, -1,  1, -1,  1, -1, -1,  1,  1,									 1, -1, -1,	 1, -1,  1,  1,  1, -1,  1,  1,  1 };	static GLuint indices[] = { 0, 4, 6, 0, 6, 2, 3, 7, 5, 3, 5, 1, 2, 3, 1, 2, 1, 0,								4, 5, 7, 4, 7, 6, 3, 2, 7, 2, 6, 7, 0, 1, 4, 1, 5, 4 };				glEnableClientState( GL_VERTEX_ARRAY );		glVertexPointer( 3, GL_INT, 0, vertices );				glMatrixMode( GL_MODELVIEW );	glPushMatrix();	glTranslatef( 0.0f, 0.0f, sinf( SDL_GetTicks() / 250.0f ) * 8.0f );		glColor3f( 1, 0, 0 );		glDrawElements( GL_TRIANGLES, 36, GL_UNSIGNED_INT, indices );		glPopMatrix();	glPushMatrix();	glTranslatef( 0.0f, 0.0f, 10.0f );	glColor3f( 0, 1, 0 );	glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices );		glPopMatrix();		glDisableClientState( GL_VERTEX_ARRAY );  }void draw_camera(){	float mat[ 16 ];	float inv[ 16 ];		glGetFloatv( GL_MODELVIEW_MATRIX, mat );	invertMatrix( mat, inv );	float c[ 8 ][ 4 ] = {	{ -2,  2,    1, 1 },							{  2,  2,    1, 1 },							{  2, -2,    1, 1 },							{ -2, -2,    1, 1 },							{ -2,  2,  100, 1 },							{  2,  2,  100, 1 },							{  2, -2,  100, 1 },							{ -2, -2,  100, 1 } };		int i;	float p[ 8 ][ 4 ];	for ( i = 0; i < 8; i++ )		multMatrixVector( inv, c, p );<br><br>	glColor3f( <span class="cpp-number">1</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span> );<br>	glBegin( GL_LINES );<br>		glVertex3fv( p[ <span class="cpp-number">0</span> ] ); glVertex3fv( p[ <span class="cpp-number">1</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">1</span> ] ); glVertex3fv( p[ <span class="cpp-number">2</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">2</span> ] ); glVertex3fv( p[ <span class="cpp-number">3</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">3</span> ] ); glVertex3fv( p[ <span class="cpp-number">0</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">4</span> ] ); glVertex3fv( p[ <span class="cpp-number">5</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">5</span> ] ); glVertex3fv( p[ <span class="cpp-number">6</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">6</span> ] ); glVertex3fv( p[ <span class="cpp-number">7</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">7</span> ] ); glVertex3fv( p[ <span class="cpp-number">4</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">0</span> ] ); glVertex3fv( p[ <span class="cpp-number">4</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">1</span> ] ); glVertex3fv( p[ <span class="cpp-number">5</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">2</span> ] ); glVertex3fv( p[ <span class="cpp-number">6</span> ] );<br>		glVertex3fv( p[ <span class="cpp-number">3</span> ] ); glVertex3fv( p[ <span class="cpp-number">7</span> ] );<br>	glEnd();<br>}<br><br><span class="cpp-keyword">void</span> renderScene()<br>{<br>	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );<br><br>	glMatrixMode( GL_MODELVIEW );<br>	glLoadIdentity();<br>    glViewport( <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">320</span>, <span class="cpp-number">480</span> );<br>	gluLookAt( <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, -<span class="cpp-number">20</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">1</span>, <span class="cpp-number">0</span> );<br>	draw_screen();<br><br>	glMatrixMode( GL_MODELVIEW );<br>	glLoadIdentity();<br>    glViewport( <span class="cpp-number">320</span>, <span class="cpp-number">0</span>, <span class="cpp-number">320</span>, <span class="cpp-number">480</span> );<br>	gluLookAt( <span class="cpp-number">20</span>, <span class="cpp-number">20</span>, -<span class="cpp-number">20</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, <span class="cpp-number">1</span>, <span class="cpp-number">0</span> );	<br>	draw_screen();	<br>	draw_camera();	<br><br>	SDL_GL_SwapBuffers( );<br>}<br><br></pre></div><!–ENDSCRIPT–> 
After a quick look, my first guess is that the matrix indices in the matrix-vector mult function are the transpose of what they should be. You might just comment out the current version and try it with transposed indices, and see if that fixes the problem.
Hi again. I did this already, and it didn't solve my problem. :-( The error must be somewhere else.

This topic is closed to new replies.

Advertisement