Public Group

# converting glfrustum to gluperspective

This topic is 3079 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Trying to teach myself computer graphics so I'm reading a textbook

/* Rotating cube with viewer movement from Chapter 5 *//* Cube definition and display similar to rotating--cube program *//* We use the Lookat function in the display callback to pointthe viewer, whose position can be altered by the x,X,y,Y,z, and Z keys.The perspective view is set in the reshape callback */#include <stdlib.h>;#ifdef __APPLE__#include <GLUT/glut.h>;#else#include <GL/glut.h>;#endif	GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},	{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, 	{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};	GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},	{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, 	{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};	GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},	{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, 	{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};void polygon(int a, int b, int c , int d){	glBegin(GL_POLYGON);		glColor3fv(colors[a]);		glNormal3fv(normals[a]);		glVertex3fv(vertices[a]);		glColor3fv(colors);		glNormal3fv(normals);		glVertex3fv(vertices);		glColor3fv(colors[c]);		glNormal3fv(normals[c]);		glVertex3fv(vertices[c]);		glColor3fv(colors[d]);		glNormal3fv(normals[d]);		glVertex3fv(vertices[d]);	glEnd();																										}void colorcube(){	polygon(0,3,2,1);	polygon(2,3,7,6);	polygon(0,4,7,3);	polygon(1,2,6,5);	polygon(4,5,6,7);	polygon(0,1,5,4);}static GLfloat theta[] = {0.0,0.0,0.0};static GLint axis = 2;static GLdouble viewer[]= {0.0, 0.0, 5.0}; /* initial viewer location */void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/* Update viewer position in modelview matrix */	glLoadIdentity();	gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);/* rotate cube */	glRotatef(theta[0], 1.0, 0.0, 0.0);	glRotatef(theta[1], 0.0, 1.0, 0.0);	glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glFlush();	glutSwapBuffers();}void mouse(int btn, int state, int x, int y){	if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;	if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;	if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;	theta[axis] += 2.0;	if( theta[axis] &gt; 360.0 ) theta[axis] -= 360.0;	display();}void keys(unsigned char key, int x, int y){/* Use x, X, y, Y, z, and Z keys to move viewer */   if(key == 'x') viewer[0]-= 1.0;   if(key == 'X') viewer[0]+= 1.0;   if(key == 'y') viewer[1]-= 1.0;   if(key == 'Y') viewer[1]+= 1.0;   if(key == 'z') viewer[2]-= 1.0;   if(key == 'Z') viewer[2]+= 1.0;   display();}void myReshape(int w, int h){ glViewport(0, 0, w, h);/* Use a perspective view */ glMatrixMode(GL_PROJECTION);  glLoadIdentity();	if(w&lt;=h) glFrustum(-2.0, 2.0, -2.0 * (GLfloat) h/ (GLfloat) w,        2.0* (GLfloat) h / (GLfloat) w, 2.0, 20.0);	else glFrustum(-2.0, 2.0, -2.0 * (GLfloat) w/ (GLfloat) h,        2.0* (GLfloat) w / (GLfloat) h, 2.0, 20.0);/* Or we can use gluPerspective */ /* gluPerspective(45.0, w/h, -10.0, 10.0); */ glMatrixMode(GL_MODELVIEW);}voidmain(int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("colorcube"); glutReshapeFunc(myReshape); glutDisplayFunc(display);	glutMouseFunc(mouse);	glutKeyboardFunc(keys);	glEnable(GL_DEPTH_TEST); glutMainLoop();}

It says in the myReshape function I can use that gluPerspective statement instead but no matter what I try it doesn't work. Help a newbie please.

##### Share on other sites
What do you mean "it doesn't work" ?
Give a short description, get a short reply =/

##### Share on other sites
I mean its just a black window. Before changing you can see and move the cube.

##### Share on other sites
Quote:
 gluPerspective(45.0, w/h, -10.0, 10.0);

"w" and "h" are defined as ints. You're doing an integer divide. Try GLfloat aspect = (GLfloat)w/(GLfloat)h as you do in the frustum call.

Also, your near and far plances look suspect. You might try something like:

gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 10.0);

From the docs for gluPerspective:
Quote:
 zNearSpecifies the distance from the viewer to the near clipping plane (always positive). zFarSpecifies the distance from the viewer to the far clipping plane (always positive).

For sure, it doesn't like the negative value.

1. 1
2. 2
3. 3
Rutin
16
4. 4
5. 5

• 13
• 26
• 10
• 11
• 9
• ### Forum Statistics

• Total Topics
633722
• Total Posts
3013549
×