Jump to content
  • Advertisement
Sign in to follow this  
nick2price

OpenGL problem understanding why camera isnt working

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have gone through a load of tutorials and managed to get some code together to control a camera through the arrow keys. Everything compiles ok, the only problem is that the arrow keys dont do anything. Can someone please take a quick look and help me understand why. I am finding all this quite difficult, so i have problably done a load of stuff i dont need too, or repeated stuff between the two classes. But any help would be great, cheers class which creates a skybox and loads in a model car
 
 
#include "stdafx.h"
#include <GL/glut.h>
#include <windows.h>
#include <stdio.h>  //for file access							
#include <gl\gl.h>													
#include "skybox.h"
#include "glbmp.h"
#include "coursework2.h"
#include "3dsloader.h"
#include "texture.h"

obj_type object;

bool skybox::LoadTexture(unsigned int & aTexture, const char * bitmap_file)
{
   glbmp_t bitmap;     //object to fill with data from glbmp
 

   if(!glbmp_LoadBitmap(bitmap_file, 0, &bitmap))
   {
      fprintf(stderr, "Error loading bitmap file: %s\n", bitmap_file);
   }
 
   //generate and bind the OpenGL texture
   glGenTextures(1, &aTexture);
   glBindTexture(GL_TEXTURE_2D, aTexture);
 
   //copy data from bitmap into texture
   glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap.width, bitmap.height,
                0, GL_RGB, GL_UNSIGNED_BYTE, bitmap.rgb_data);
 
   //set up texture filtering
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
   //free the bitmap
   glbmp_FreeBitmap(&bitmap);
 
   return true;
}
 


void skybox::Init() {

	OFFSET = 1/512.0; //set offset value for skybox


  

	LoadTexture(texture[0], "images/1.bmp");
	LoadTexture(texture[1], "images/2.bmp");
	LoadTexture(texture[2], "images/3.bmp");
	LoadTexture(texture[3], "images/4.bmp");
	LoadTexture(texture[4], "images/5.bmp");
	LoadTexture(texture[5], "images/6.bmp");

}

void skybox::Init2(){



	glClearColor(0.0, 0.0, 0.0, 0.0); // This clear the background color to black
    glShadeModel(GL_SMOOTH); // Type of shading for the polygons
   	
   
    // Projection transformation
    glMatrixMode(GL_PROJECTION); // Specifies which matrix stack is the target for matrix operations 
    glLoadIdentity(); // initialize the projection matrix as identity
   
    glEnable(GL_DEPTH_TEST); // enable the depth test (also called z buffer)
    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); // Polygon rasterization mode (polygon filled)
    
    glEnable(GL_TEXTURE_2D); // This Enable the Texture mapping

    Load3DS (&object,"GTR.3ds");

    object.id_texture=LoadBitmap("body.bmp"); // The Function LoadBitmap() return the current texture ID
    

}

void skybox::draw() {

	glPushMatrix();

	glColor3f(1.0f,1.0f,1.0f);			//Set colour to White
	glEnable(GL_TEXTURE_2D);			//Enable texture mapping
	glDisable (GL_DEPTH_TEST);			//Disable depth testing

		//before you can use a texture you have to bind it
		glBindTexture(GL_TEXTURE_2D, texture[0 + text_offset]);

		glBegin (GL_QUADS);	
		
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET,0.0 + OFFSET);	glVertex3d (-10.0,-10.0,10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET,0.0 + OFFSET);	glVertex3d (-10.0,-10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET,1.0 - OFFSET);	glVertex3d (-10.0,10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET,1.0 - OFFSET);	glVertex3d (-10.0,10.0,10.0);

		glEnd ();				

		glBindTexture(GL_TEXTURE_2D, texture[1 + text_offset]);
		glBegin (GL_QUADS);
		
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET,0.0 + OFFSET);	glVertex3d (-10.0,-10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET,0.0 + OFFSET);	glVertex3d (10.0,-10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET,1.0 - OFFSET);	glVertex3d (10.0,10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET,1.0 - OFFSET);	glVertex3d (-10.0,10.0,-10.0);
		glEnd ();

		glBindTexture(GL_TEXTURE_2D, texture[2 + text_offset]);
		glBegin (GL_QUADS);
		
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,0.0 + OFFSET); glVertex3d (10.0,-10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,0.0 + OFFSET); glVertex3d (10.0,-10.0,10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,1.0 - OFFSET); glVertex3d (10.0,10.0,10.0);
				glNormal3d (0.0,0.0,10.0); glTexCoord2d (0.0 + OFFSET ,1.0 - OFFSET); glVertex3d (10.0,10.0,-10.0);

		glEnd ();

		glBindTexture(GL_TEXTURE_2D, texture[3 + text_offset]);	
		glBegin (GL_QUADS);
			
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,0.0 + OFFSET); glVertex3d (10.0,-10.0,10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,0.0 + OFFSET); glVertex3d (-10.0,-10.0,10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,1.0 - OFFSET); glVertex3d (-10.0,10.0,10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,1.0 - OFFSET); glVertex3d (10.0,10.0,10.0);
		
		glEnd ();

		glBindTexture(GL_TEXTURE_2D, texture[4 + text_offset]);	
		glBegin (GL_QUADS);
			
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,0.0 + OFFSET); glVertex3d (-10.0,-10.0,10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,0.0 + OFFSET); glVertex3d (10.0,-10.0,10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,1.0 - OFFSET); glVertex3d (10.0,-10.0,-10.0);
			glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,1.0 - OFFSET); glVertex3d (-10.0,-10.0,-10.0);
		
		glEnd ();

		glBindTexture(GL_TEXTURE_2D, texture[5 + text_offset]);
		glBegin (GL_QUADS);
		
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,0.0 + OFFSET); glVertex3d (-10.0,10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,0.0 + OFFSET); glVertex3d (10.0,10.0,-10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (1.0 - OFFSET ,1.0 - OFFSET); glVertex3d (10.0,10.0,10.0);
				glNormal3d (0.0,0.0,1.0); glTexCoord2d (0.0 + OFFSET ,1.0 - OFFSET); glVertex3d (-10.0,10.0,10.0);
				
		glEnd ();

	//Re-Enable the depth test
	glEnable(GL_DEPTH_TEST);
	//disable texture mapping
	glDisable(GL_TEXTURE_2D);
	glPopMatrix();
	

}

void skybox::draw_car(void){

	int l_index;
    
    glMatrixMode(GL_MODELVIEW); // Modeling transformation
    glLoadIdentity(); // Initialize the model matrix as identity
    
    glBindTexture(GL_TEXTURE_2D, object.id_texture); // set the active texture 

    glBegin(GL_TRIANGLES);
    for (l_index=0;l_index<object.polygons_qty;l_index++)
    {
        //----------------- FIRST VERTEX -----------------
        // Texture coordinates of the first vertex
        glTexCoord2f( object.mapcoord[ object.polygon[l_index].a ].u,
                      object.mapcoord[ object.polygon[l_index].a ].v);
        // Coordinates of the first vertex
        glVertex3f( object.vertex[ object.polygon[l_index].a ].x,
                    object.vertex[ object.polygon[l_index].a ].y,
                    object.vertex[ object.polygon[l_index].a ].z); //Vertex definition

        //----------------- SECOND VERTEX -----------------
        // Texture coordinates of the second vertex
        glTexCoord2f( object.mapcoord[ object.polygon[l_index].b ].u,
                      object.mapcoord[ object.polygon[l_index].b ].v);
        // Coordinates of the second vertex
        glVertex3f( object.vertex[ object.polygon[l_index].b ].x,
                    object.vertex[ object.polygon[l_index].b ].y,
                    object.vertex[ object.polygon[l_index].b ].z);
        
        //----------------- THIRD VERTEX -----------------
        // Texture coordinates of the third vertex
        glTexCoord2f( object.mapcoord[ object.polygon[l_index].c ].u,
                      object.mapcoord[ object.polygon[l_index].c ].v);
        // Coordinates of the Third vertex
        glVertex3f( object.vertex[ object.polygon[l_index].c ].x,
                    object.vertex[ object.polygon[l_index].c ].y,
                    object.vertex[ object.polygon[l_index].c ].z);
    }
    glEnd();

 

}

main class which calls up my skymap and car
 
#include "stdafx.h"
#include <GL/glut.h>
#include <windows.h>
#include <stdio.h>  //for file access							
#include <gl\gl.h>													
#include "skybox.h"
#include "glbmp.h"
#include "coursework2.h"
#include "3dsloader.h"
#include "texture.h"

int screen_width=800;
int screen_height=600;

skybox		aSkyBox;

double rotation_x=0, rotation_x_increment=0.1;
double rotation_y=0, rotation_y_increment=0.05;
double rotation_z=0, rotation_z_increment=0.03;
 
// Flag for rendering as lines or filled polygons
int filling=1; //0=OFF 1=ON

GLvoid ReSizeGLScene(GLsizei width, GLsizei height) {

	if (height<=0) { height=1; }

	glViewport(0,0,width,height);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);
	glutPostRedisplay ();
}

int InitGL(GLvoid) {
	
	glEnable(GL_TEXTURE_2D);
	glShadeModel(GL_SMOOTH);							//Try GL_FLAT to see the difference
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);				//Background colour
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);							//Enables depth testing
	glDepthFunc(GL_LEQUAL);								//Specifies how Depth testing is done
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	//Affects quality of colour and texture interpolation
	glFrontFace (GL_CCW);								//Specifies that the front of a face is defined 
														//in a Counter Clockwise manner
	glCullFace(GL_BACK);								//Specifies that the back of faces are not shown
														//so OpenGL does not need to draw things twice
	glEnable(GL_CULL_FACE);								//Enables culling of faces


	aSkyBox.Init();			//Initalize the Skybox
    aSkyBox.Init2();

	return TRUE;
}


void keyboard_s (int key, int x, int y)
{
   switch (key)
   {
      case GLUT_KEY_UP:
         rotation_x_increment = rotation_x_increment +0.005;
      break;
      case GLUT_KEY_DOWN:
         rotation_x_increment = rotation_x_increment -0.005;
      break;
      case GLUT_KEY_LEFT:
         rotation_y_increment = rotation_y_increment +0.005;
      break;
      case GLUT_KEY_RIGHT:
         rotation_y_increment = rotation_y_increment -0.005;
      break;
   }
}

void display(void) {

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
    glTranslatef(0.0,0.0,-10); // We move the object 50 points forward (the model matrix is multiplied by the translation matrix)
 
    rotation_x = rotation_x + rotation_x_increment;
    rotation_y = rotation_y + rotation_y_increment;
    rotation_z = rotation_z + rotation_z_increment;

    if (rotation_x > 359) rotation_x = 0;
    if (rotation_y > 359) rotation_y = 0;
    if (rotation_z > 359) rotation_z = 0;

    glRotatef(rotation_x,1.0,0.0,0.0); // Rotations of the object (the model matrix is multiplied by the rotation matrices)
    glRotatef(rotation_y,0.0,1.0,0.0);
    glRotatef(rotation_z,0.0,0.0,1.0);

	aSkyBox.draw();
	//aSkyBox.draw_car();
	glFlush(); 
	glutSwapBuffers(); 
 
}


int main(int argc, char **argv)
{
    glutInit(&argc, argv);    
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(screen_width,screen_height);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Coursework 2");    
 
	glutReshapeFunc(ReSizeGLScene);
	glutDisplayFunc(display);
	glutSpecialFunc (keyboard_s);
	InitGL();
    glutMainLoop();

    return(0);    
}

thanks again

Share this post


Link to post
Share on other sites
Advertisement
Not sure if this will work, but try calling glutPostRedisplay() inside each case in keyboard_s():

void keyboard_s (int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_UP:
rotation_x_increment = rotation_x_increment +0.005;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
rotation_x_increment = rotation_x_increment -0.005;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
rotation_y_increment = rotation_y_increment +0.005;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
rotation_y_increment = rotation_y_increment -0.005;
glutPostRedisplay();
break;
}
}

Share this post


Link to post
Share on other sites
Inside the drawCar() function you switch to modelview matrix and then load the identity. According to your comments you want to rotate the modelview matrix, which you're doing, except that call to loadIdentity() effectively erases it.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!