void Camera::zoomCam(float zoom) { float zoomMat[16]; setTransMatrix(zoomMat, 0.0f, 0.0f, zoom); multiplyMatrix(zoomMat, viewMatrix); setIdentMatrix(viewMatrix, 4); multiplyMatrix(viewMatrix, zoomMat); }
// View Matrix // just like glulookat void placeCam(float posX, float posY, float posZ, float lookX, float lookY, float lookZ) { float dir[3], right[3], up[3]; up[0] = 0.0f; up[1] = 1.0f; up[2] = 0.0f; dir[0] = (lookX - posX); dir[1] = (lookY - posY); dir[2] = (lookZ - posZ); normalize(dir); // this order matters xProduct(dir,up,right); normalize(right); xProduct(right,dir,up); normalize(up); float aux[16]; viewMatrix[0] = right[0]; viewMatrix[1] = up[0]; viewMatrix[2] = -dir[0]; viewMatrix[3] = 0.0f; viewMatrix[4] = right[1]; viewMatrix[5] = up[1]; viewMatrix[6] = -dir[1]; viewMatrix[7] = 0.0f; viewMatrix[8] = right[2]; viewMatrix[9] = up[2]; viewMatrix[10] = -dir[2]; viewMatrix[11] = 0.0f; viewMatrix[12] = 0.0f; viewMatrix[13] = 0.0f; viewMatrix[14] = 0.0f; viewMatrix[15] = 1.0f; normalMatrix[0] = viewMatrix[0]; normalMatrix[1] = viewMatrix[1]; normalMatrix[2] = viewMatrix[2]; normalMatrix[3] = viewMatrix[4]; normalMatrix[4] = viewMatrix[5]; normalMatrix[5] = viewMatrix[6]; normalMatrix[6] = viewMatrix[8]; normalMatrix[7] = viewMatrix[9]; normalMatrix[8] = viewMatrix[10]; setTransMatrix(aux, -posX, -posY, -posZ); multiplyMatrix(viewMatrix, aux); }
void renderScene(void) { frame++; time=glutGet(GLUT_ELAPSED_TIME); if (MoveLight && (time - timebase2 > 10)) { lightAngle = PI/36; myMulti(lightPosition, rotationMatrix(0.0, 1.0, 0.0, lightAngle)); timebase2 = time; } if (time - timebase > 1000) { sprintf(s,"FPS:%4.2f", frame*1000.0/(time-timebase)); timebase = time; frame = 0; } glutSetWindowTitle(s); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //placeCam(10,2,10,0,2,-5); placeCam(viewPosition[0],viewPosition[1],viewPosition[2],0,0,-5); multiplyMatrix(viewMatrix, rotationMatrix(0.0,1.0,0.0, angle)); multiplyMatrix(viewMatrix, rotationMatrix(1.0,0.0,0.0, angle2)); glUseProgram(p); setUniforms(); glBindVertexArray(vert[0]); glDrawArrays(GL_TRIANGLES, 0, sizeof(vertices1)); float T[16]; setScale(T,0.5,0.5,0.5); multiplyMatrix(viewMatrix, T); setTransMatrix(T,4,0,0); multiplyMatrix(viewMatrix, T); setUniforms(); glBindVertexArray(vert[1]); glDrawArrays(GL_TRIANGLES, 0, sizeof(vertices1)); glutSwapBuffers(); }
// View Matrix // just like glulookat void Camera::placeCam(float posX, float posY, float posZ, float lookX, float lookY, float lookZ) { float dir[3], right[3], up[3]; up[0] = 0.0f; up[1] = 1.0f; up[2] = 0.0f; dir[0] = (lookX - posX); dir[1] = (lookY - posY); dir[2] = (lookZ - posZ); normalize(dir); //zoom //posX += dir[0] // this order matters xProduct(dir,up,right); normalize(right); xProduct(right,dir,up); normalize(up); float aux[16]; viewMatrix[0] = right[0]; viewMatrix[1] = up[0]; viewMatrix[2] = -dir[0]; viewMatrix[3] = 0.0f; viewMatrix[4] = right[1]; viewMatrix[5] = up[1]; viewMatrix[6] = -dir[1]; viewMatrix[7] = 0.0f; viewMatrix[8] = right[2]; viewMatrix[9] = up[2]; viewMatrix[10] = -dir[2]; viewMatrix[11] = 0.0f; viewMatrix[12] = 0.0f; viewMatrix[13] = 0.0f; viewMatrix[14] = 0.0f; viewMatrix[15] = 1.0f; setTransMatrix(aux, -posX, -posY, -posZ); multiplyMatrix(viewMatrix, aux); // you should do this instead. If you want to apply rotation to your viewMatrix. //multiplyMatrix(viewMatrix, rotationMatrix(0.0,0.0,1.0, 0.785)); }