View 3D model in OpenGL
left | right | bottom | top | near | far |
-8 | 8 | -6 | 6 | 1 | 100 |
Eye position | Optical center | View-up vector | ||||||
x | y | z | x | y | z | x | y | z |
0 | 0 | 10 | 0 | 0 | 0 | 0 | 1 | 0 |
left | right | bottom | top | near | far |
-4 | 4 | -3 | 3 | 1 | 100 |
Eye position | Optical center | View-up vector | ||||||
x | y | z | x | y | z | x | y | z |
0 | 10 | 0 | 0 | 0 | 0 | 1 | 0 | 2 |
left | right | bottom | top | near | far |
-4 | 4 | -3 | 3 | 1 | 100 |
Eye position | Optical center | View-up vector | ||||||
x | y | z | x | y | z | x | y | z |
0 | 10 | 0 | 0 | 0 | 0 | 1 | 0 | 2 |
field of view | aspect | near | far |
20 degree | 4/3 | 1 | 100 |
Eye position | Optical center | View-up vector | ||||||
x | y | z | x | y | z | x | y | z |
0 | 0 | 20 | 0 | 0 | 0 | 1 | 1 | 0 |
field of view | aspect | near | far |
30 degree | 4/3 | 1 | 100 |
Eye position | Optical center | View-up vector |
x | y | z | x | y | z | x | y | z |
10 | 10 | 10 | 0 | 0 | 0 | 0 | 1 | 0 |
field of view | aspect | near | far |
70 degree | 4/3 | 1 | 100 |
Eye position | Optical center | View-up vector | ||||||
x | y | z | x | y | z | x | y | z |
3 | 3 | 3 | 0 | 0 | 0 | 0 | 1 | 0 |
The results look like these:
Solution
main.cpp
#include “utilVisualizer.h”
int main(intargc, char **argv) {
// insert code here…
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutReshapeFunc(reshape);
//Change here with your name and surname as indicated in the instruction pdf
glutCreateWindow(“Titoloprovvisorio”);
glutDisplayFunc(display);
glutKeyboardFunc(keyboardFunction);
init();
glutMainLoop();
return 0;
}
utilVisualizer.h
#ifndefutilVisualizer_h
#define utilVisualizer_h
#include
#include
#include
#include
#ifdef __APPLE__
#include
#include
#include
#else
#include
#include
#include
#include
#endif
#include
#include
// Include GLM
#include “glm/glm/glm.hpp”
#include “glm/glm/gtc/matrix_transform.hpp”
#include “glm/glm/gtx/transform.hpp”
using namespace glm;
using namespace std;
enumcameraOptions{OPT1, OPT2, OPT3, OPT4, OPT5, OPT6};
//void setUpDisplay();
intnumTs;
int option;
//the id of the shader program
GLuintprogram_id;
struct triangle{
vec3 V1;
vec3 V2;
vec3 V3;
vec4 colorV1;
vec4 colorV2;
vec4 colorV3;
};
vector
voidloadMesh(string fileName){
ifstreamreadF;
readF.open(fileName);
if(!readF.is_open()){
cerr<< “Unable to open file “< exit(-2); } readF>>numTs; if(numTs==0){ cerr<< ” Invalid number of primitives”< exit(-2); } for(unsigned int ii=0; ii triangle aux; //intauxI = 0; readF>> aux.V1[0]; readF>> aux.V1[1]; readF>> aux.V1[2]; readF>> aux.colorV1[0]; readF>> aux.colorV1[1]; readF>> aux.colorV1[2]; readF>> aux.colorV1[3]; readF>> aux.V2[0]; readF>> aux.V2[1]; readF>> aux.V2[2]; readF>> aux.colorV2[0]; readF>> aux.colorV2[1]; readF>> aux.colorV2[2]; readF>> aux.colorV2[3]; readF>> aux.V3[0]; readF>> aux.V3[1]; readF>> aux.V3[2]; readF>> aux.colorV3[0]; readF>> aux.colorV3[1]; readF>> aux.colorV3[2]; readF>> aux.colorV3[3]; mesh.push_back(aux); } } voidinit(){ loadMesh(“Tris.txt”); option = cameraOptions::OPT1; glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 1.0); } voiddrawObject(){ for (unsigned int ii=0; ii triangletodraw = mesh.at(ii); glBegin(GL_TRIANGLES); glColor4f(todraw.colorV1[0], todraw.colorV1[1], todraw.colorV1[2], todraw.colorV1[3]); glVertex3f(todraw.V1[0], todraw.V1[1], todraw.V1[2]); glColor4f(todraw.colorV2[0], todraw.colorV2[1], todraw.colorV2[2], todraw.colorV2[3]); glVertex3f(todraw.V2[0], todraw.V2[1], todraw.V2[2]); glColor4f(todraw.colorV3[0], todraw.colorV3[1], todraw.colorV3[2], todraw.colorV3[3]); glVertex3f(todraw.V3[0], todraw.V3[1], todraw.V3[2]); glEnd(); } } void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); switch (option) { casecameraOptions::OPT1: glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-8.0, 8.0, -6.0, 6.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); break; casecameraOptions::OPT2 : glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-4.0, 4.0, -3.0, 3.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.0); break; casecameraOptions::OPT3 : glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-4.0, 4.0, -3.0, 3.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(10.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0, -1.0, 0.0); // break; casecameraOptions::OPT4: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(20.0, 4.0/3.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0); glTranslatef(0.0, -1.0, 0.0); // break; casecameraOptions::OPT5: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, 4.0/3.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(10.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0, -1.0, 0.0); break; casecameraOptions::OPT6: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70.0, 4.0/3.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(3.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glRotatef(45.0, 1.0, 0.0, 0.0); glTranslatef(0.0, -1.0, 0.0); break; default: break; } drawObject(); glutSwapBuffers(); } voidkeyboardFunction(unsigned char key, int mx, int my){ switch (key) { case ‘1’: option = cameraOptions::OPT1; break; case ‘2’: option = cameraOptions::OPT2; break; case ‘3’: option = cameraOptions::OPT3; break; case ‘4’: option = cameraOptions::OPT4; break; case ‘5’: option = cameraOptions::OPT5; break; case ‘6’: option = cameraOptions::OPT6; break; case ‘Q’: case ‘q’: case 27: exit(0); default: break; } glutPostRedisplay(); } void reshape(int width, int height){ glViewport(0, 0, width, height); } #endif /* utilVisualizer_h */ utilVisualizerShader.h #ifndefutilVisualizerShader_h #define utilVisualizeShaderr_h #include #include #include #include #ifdef __APPLE__ #include #include #include #else #include #include #include #include #endif #include #include // Include GLM #include “glm/glm/glm.hpp” #include “glm/glm/gtc/matrix_transform.hpp” #include “glm/glm/gtx/transform.hpp” using namespace glm; using namespace std; enumcameraOptions{OPT1, OPT2, OPT3, OPT4, OPT5, OPT6}; //void setUpDisplay(); intnumTs; int option; //the id of the shader program GLuintprogram_id; struct triangle{ vec3 V1; vec3 V2; vec3 V3; vec4 colorV1; vec4 colorV2; vec4 colorV3; }; vector vector GLfloat *vertices; GLfloatlight_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloatlight_position[] = {1.0, 1.0, 1.0, 0.0}; voidloadMesh(string fileName){ ifstreamreadF; readF.open(fileName); if(!readF.is_open()){ cerr<< “Unable to open file “< exit(-2); } readF>>numTs; if(numTs==0){ cerr<< ” Invalid number of primitives”< exit(-2); } for(unsigned int ii=0; ii triangle aux; //intauxI = 0; readF>> aux.V1[0]; readF>> aux.V1[1]; readF>> aux.V1[2]; readF>> aux.colorV1[0]; readF>> aux.colorV1[1]; readF>> aux.colorV1[2]; readF>> aux.colorV1[3]; readF>> aux.V2[0]; readF>> aux.V2[1]; readF>> aux.V2[2]; readF>> aux.colorV2[0]; readF>> aux.colorV2[1]; readF>> aux.colorV2[2]; readF>> aux.colorV2[3]; readF>> aux.V3[0]; readF>> aux.V3[1]; readF>> aux.V3[2]; readF>> aux.colorV3[0]; readF>> aux.colorV3[1]; readF>> aux.colorV3[2]; readF>> aux.colorV3[3]; mesh.push_back(aux); for(unsigned intkk=0; kk<3;kk++) g_vertex_buffer_data.push_back(aux.V1[kk]); for(unsigned intkk=0; kk<3;kk++) g_vertex_buffer_data.push_back(aux.V2[kk]); for(unsigned intkk=0; kk<3;kk++) g_vertex_buffer_data.push_back(aux.V2[kk]); } } char *textFileRead(char *fn){ FILE* fp; char *content = NULL; longint count = 0; if(fn != NULL){ fp = fopen(fn, “rt”); if(fp!=NULL){ fseek(fp, 0, SEEK_END); count = ftell(fp); rewind(fp); if(count > 0){ content = (char*)malloc(sizeof(char)*(count+1)); count = fread(content, sizeof(char), count, fp); content[count] = ‘\0’; } fclose(fp); } } return content; } GLuintLoadShaders(const char * vertex_file_path,const char * fragment_file_path){ // Create the shaders GLuintVertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuintFragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); // Read the Vertex Shader code from the file std::stringVertexShaderCode; std::ifstreamVertexShaderStream(vertex_file_path, std::ios::in); if(VertexShaderStream.is_open()){ std::string Line = “”; while(getline(VertexShaderStream, Line)) VertexShaderCode += “\n” + Line; VertexShaderStream.close(); }else{ printf(“Impossible to open %s. Are you in the right directory ? Don’t forget to read the FAQ !\n”, vertex_file_path); getchar(); return 0; } // Read the Fragment Shader code from the file std::stringFragmentShaderCode; std::ifstreamFragmentShaderStream(fragment_file_path, std::ios::in); if(FragmentShaderStream.is_open()){ std::string Line = “”; while(getline(FragmentShaderStream, Line)) FragmentShaderCode += “\n” + Line; FragmentShaderStream.close(); } GLint Result = GL_FALSE; intInfoLogLength; // Compile Vertex Shader //printf(“Compiling shader : %s\n”, vertex_file_path); charconst * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); glCompileShader(VertexShaderID); // Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength> 0 ){ std::vector glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); printf(“%s\n”, &VertexShaderErrorMessage[0]); } // Compile Fragment Shader //printf(“Compiling shader : %s\n”, fragment_file_path); charconst * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); glCompileShader(FragmentShaderID); // Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength> 0 ){ std::vector glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); printf(“%s\n”, &FragmentShaderErrorMessage[0]); } // Link the program //printf(“Linking program\n”); GLuintProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength> 0 ){ std::vector glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); printf(“%s\n”, &ProgramErrorMessage[0]); } glDetachShader(ProgramID, VertexShaderID); glDetachShader(ProgramID, FragmentShaderID); glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); returnProgramID; } voidinit(){ loadMesh(“../../Homework3/Tris.txt”); option = cameraOptions::OPT1; glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 1.0); // Set them to the correct path program_id = LoadShaders(“../trisShader.vert”, “../trisShader.frag”); vertices = new GLfloat[g_vertex_buffer_data.size()]; for(unsigned int ii=0; ii vertices[ii] = g_vertex_buffer_data.at(ii); } void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for(unsigned int ii=0; ii mat4projectionMatrix, viewMatrix, modelMatrix, MVP, transla, rota; GLuintMatrixID = glGetUniformLocation(program_id, “MVP”); switch (option) { casecameraOptions::OPT1: projectionMatrix = ortho(-8.0, 8.0, -6.0, 6.0, 1.0, 100.0); viewMatrix = lookAt(vec3(0.0,0.0,10.0), vec3(0,0,0), vec3(0.0,1.0, 0.0)); modelMatrix = translate(vec3(0.0, 0.0, 0.0));//mat4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); MVP = projectionMatrix*viewMatrix*modelMatrix; break; casecameraOptions::OPT2 : projectionMatrix = ortho(-4.0, 4.0, -3.0, 3.0, 1.0, 100.0); viewMatrix = lookAt(vec3(0.0,10.0,0.0), vec3(0,0,0), vec3(1.0,0.0, 2.0)); modelMatrix = translate(vec3(0.0, 0.0, 0.0)); MVP = projectionMatrix*viewMatrix*modelMatrix; break; casecameraOptions::OPT3 : projectionMatrix = ortho(-4.0, 4.0, -3.0, 3.0, 1.0, 100.0); viewMatrix = lookAt(vec3(0.0,10.0,10.0), vec3(0,0,0), vec3(0.0,1.0, 0.0)); modelMatrix = translate(vec3(0.0, -1.0, 0.0)); MVP = projectionMatrix*viewMatrix*modelMatrix; break; casecameraOptions::OPT4: projectionMatrix = perspective(20.0, 4.0/3.0, 1.0, 100.0); viewMatrix = lookAt(vec3(0.0,0.0,20.0), vec3(0,0,0), vec3(1.0,1.0, 0.0)); modelMatrix = translate(vec3(0.0, -1.0, 0.0)); MVP = projectionMatrix*viewMatrix*modelMatrix; break; casecameraOptions::OPT5: projectionMatrix = perspective(30.0, 4.0/3.0, 1.0, 100.0); viewMatrix = lookAt(vec3(10.0,10.0,10.0), vec3(0,0,0), vec3(0.0,1.0, 0.0)); modelMatrix = translate(vec3(0.0, -1.0, 0.0)); MVP = projectionMatrix*viewMatrix*modelMatrix; break; casecameraOptions::OPT6: projectionMatrix = perspective(70.0, 4.0/3.0, 1.0, 100.0); viewMatrix = lookAt(vec3(3.0,3.0,3.0), vec3(0,0,0), vec3(0.0,1.0, 0.0)); transla = translate(mat4(1.0f), vec3(0.0f, -1.0f, 0.0f)); rota = rotate(45.0f, vec3(1.0f, 0.0f, 0.0f)); modelMatrix = rota*transla; MVP = projectionMatrix*viewMatrix*modelMatrix; break; default: break; } GLuintvertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, mesh.size()*9*sizeof(float), vertices, GL_STATIC_DRAW); glUseProgram(program_id); glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, // attribute. No particular reason for 0, but must match the layout in the shader. 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)0 // array buffer offset ); glDrawArrays(GL_TRIANGLES, 0, mesh.size()*9); glDisableVertexAttribArray(0); } glutSwapBuffers(); } voidkeyboardFunction(unsigned char key, int mx, int my){ switch (key) { case ‘1’: option = cameraOptions::OPT1; break; case ‘2’: option = cameraOptions::OPT2; break; case ‘3’: option = cameraOptions::OPT3; break; case ‘4’: option = cameraOptions::OPT4; break; case ‘5’: option = cameraOptions::OPT5; break; case ‘6’: option = cameraOptions::OPT6; break; case ‘Q’: case ‘q’: case 27: exit(0); default: break; } glutPostRedisplay(); } void reshape(int width, int height){ glViewport(0, 0, width, height); } #endif /* utilVisualizerShader_h */