#include "stdafx.h" #pragma once #include "targetver.h" #include #include #include #include "glaux.h" #include #include "glut.h" #include #include #include #include using namespace std; // stała do obsługi menu podręcznego enum { EXIT // wyjście }; GLuint texture[5]; bool LoadModelOBJ(char* filename) { int vert_num=0; int triangles=0; ifstream myReadFile; myReadFile.open(filename); string output; if (myReadFile.is_open()) { while (!myReadFile.eof()) { myReadFile >> output; if (output=="v") vert_num++; if (output=="f") triangles++; } } myReadFile.close(); myReadFile.open(filename); float **vert; vert = new float *[vert_num]; //przydzielenie pamięci na w wierszy for(int i=0;i> output; if (output=="v"){ myReadFile>>vert[licz_vert][0]; myReadFile>>vert[licz_vert][1]; myReadFile>>vert[licz_vert][2]; licz_vert++;} if (output=="f"){ myReadFile>>trian[licz_triang][0]; myReadFile>>trian[licz_triang][1]; myReadFile>>trian[licz_triang][2]; licz_triang++;} } glBegin(GL_TRIANGLES); for (int i=0;isizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } if(TextureImage[1] = LoadBMP("metal.bmp")) { status = true; glGenTextures(1, &texture[1]); glBindTexture(GL_TEXTURE_2D, texture[1]); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } if(TextureImage[2] = LoadBMP("obraz.bmp")) { status = true; glGenTextures(1, &texture[2]); glBindTexture(GL_TEXTURE_2D, texture[2]); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[2]->sizeX, TextureImage[2]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } if(TextureImage[3] = LoadBMP("wall.bmp")) { status = true; glGenTextures(1, &texture[3]); glBindTexture(GL_TEXTURE_2D, texture[3]); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[3]->sizeX, TextureImage[3]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[3]->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } if(TextureImage[4] = LoadBMP("wood.bmp")) { status = true; glGenTextures(1, &texture[4]); glBindTexture(GL_TEXTURE_2D, texture[4]); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[4]->sizeX, TextureImage[4]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[4]->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } if(TextureImage[0]) { if(TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return status; } double PredkoscKamery=0; // pionowy kąt pola widzenia GLdouble fovy = 60; float czajnikrot=0; // wpółrzędne położenia obserwatora GLdouble eyex = 0; GLdouble eyey = 0; GLdouble eyez = 3; GLdouble ObrotX=3.14/2.0; GLdouble ObrotY=0; bool KeyUP=false; bool KeyDOWN=false; bool KeyRIGHT=false; bool KeyLEFT=false; // współrzędne punktu w którego kierunku jest zwrócony obserwator, GLdouble centerx = 0; GLdouble centery = 0; GLdouble centerz = -100; int figure=0; float kat=0; GLuint idlisty; // funkcja generująca scenę 3D void GenerujListyWyswietlania() { idlisty = glGenLists( 5 ); // utworzenie pierwszej listy glNewList( idlisty + 0, GL_COMPILE ); glTranslatef(0,0,10); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glTranslatef(2,0,0); glDisable(GL_TEXTURE_2D); LoadModelOBJ("test4.obj"); glEndList(); // utworzenie drugiej listy glNewList( idlisty + 1, GL_COMPILE ); glTranslatef(0,0,8); glutSolidTeapot(1); //glTranslatef(0,0,10); //glutSolidTeapot(1); //glTranslatef(0,0,10); //glutSolidTeapot(1); glEndList(); // utworzenie trzeciej listy glNewList( idlisty + 2, GL_COMPILE ); glTranslatef(0,0,10); LoadGLTextures(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); // Front face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(3.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(3.0f, 3.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 3.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Back face glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top face glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Bottom face glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Right face glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Left face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); glEndList(); // utworzenie czwratej listy glNewList( idlisty + 3, GL_COMPILE ); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); int vert_num=8; int face_num=12; //tablice statyczne // float vert[8][3]; // int face[12][3]; //tablice dynamiczne float **vert; vert = new float *[vert_num]; for (int i=0; i 0 ) aspect = width /( GLdouble ) height; // rzutowanie perspektywiczne gluPerspective( fovy, aspect, 0.01, 100.0 ); // generowanie sceny 3D Display(); } // obsługa klawiatury void Klawisze( unsigned char key, int x, int y ) { // klawisz + if( key == '+' && fovy < 180 ) fovy++; // klawisz - if( key == '-' && fovy > 0 ) fovy--; if( key == 'a' && fovy > 0 ) kat++; if( key == 'w' ) PredkoscKamery=0.02; if( key == 's' ) PredkoscKamery=-0.02; if( key == 'e' ) ObrotX+=0.02; if( key == 'q' ) ObrotX-=0.02; if( key == 'r' ) ObrotY+=0.02; if( key == 'f' ) ObrotY-=0.02; // odrysowanie okna Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); } void KlawiszeSpecjalne( int key, int x, int y ) { switch( key ) { // kursor w lewo case GLUT_KEY_LEFT: eyex += 0.1; break; // kursor w górę case GLUT_KEY_UP: eyey -= 0.1; break; // kursor w prawo case GLUT_KEY_RIGHT: eyex -= 0.1; break; // kursor w dół case GLUT_KEY_DOWN: eyey += 0.1; break; } // odrysowanie okna Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); } // obsługa menu podręcznego void Menu( int value ) { switch( value ) { // wyjście case EXIT: exit( 0 ); // wyjście case 1: figure=1; break; case 2: figure=2; break; case 3: figure=3; break; case 4: figure=4; break; } Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); } void KeyDown(int key,int x,int y) { switch(key){ case GLUT_KEY_UP: KeyUP=true; break; case GLUT_KEY_DOWN: KeyDOWN=true; break; case GLUT_KEY_LEFT: KeyLEFT=true; break; case GLUT_KEY_RIGHT: KeyRIGHT=true; break; } } void KeyUp(int key,int x,int y) { switch(key) { case GLUT_KEY_UP: KeyUP=false; break; case GLUT_KEY_DOWN: KeyDOWN=false; break; case GLUT_KEY_LEFT: KeyLEFT=false; break; case GLUT_KEY_RIGHT: KeyRIGHT=false; break; } } int main( int argc, char * argv[] ) { // inicjalizacja biblioteki GLUT glutInit( & argc, argv ); // inicjalizacja bufora ramki glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); // rozmiary głównego okna programu glutInitWindowSize( 400, 400 ); // utworzenie głównego okna programu #ifdef WIN32 glutCreateWindow( "Sześcian 3" ); #else glutCreateWindow( "Szescian 3" ); #endif // dołączenie funkcji generującej scenę 3D glutDisplayFunc( Display ); // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna glutReshapeFunc( Reshape ); // dołączenie funkcji obsługi klawiatury glutKeyboardFunc( Klawisze ); // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora // glutSpecialFunc( KlawiszeSpecjalne ); glutSpecialFunc(KeyDown); glutSpecialUpFunc(KeyUp); // utworzenie menu podręcznego glutCreateMenu( Menu ); // dodanie pozycji do menu podręcznego glutAddMenuEntry( "Wyjście", EXIT ); glutAddMenuEntry( "Rys1", 1 ); glutAddMenuEntry( "Rys2", 2 ); glutAddMenuEntry( "Rys3", 3 ); glutAddMenuEntry( "Rys4", 4 ); // określenie przycisku myszki obsługującej menu podręczne glutAttachMenu( GLUT_RIGHT_BUTTON ); GenerujListyWyswietlania(); glutIdleFunc(Display); // wprowadzenie programu do obsługi pętli komunikatów glutMainLoop(); return 0; }