void MontanaRusa::creaTuboFrenet(){ //Lo multiplicamos por el numero de vueltas GLfloat intervalo = 2*M_PI*2/NQ; PV3D** vertices = getVertices(); //Construimos los vertices de cada cara del tubo for(int i=0; i<NQ; i++){ GLfloat valor = i*intervalo; PV3D* T = primeraDerivada(valor); T->normaliza(); PV3D* B = primeraDerivada(valor)->productoVectorial(segundaDerivada(valor)); B->normaliza(); PV3D* N = B->productoVectorial(T); PV3D* C = funcion(valor); for(int j=0; j<NP; j++){ int indiceVertice = NP*i+j; PV3D* vertice = perfil[j]->multiplicaMatriz(N,B,T,C); vertices[indiceVertice] = vertice; } } //Construimos las caras for(int i=0; i<NQ; i++){ for (int j=0; j<NP; j++){ int indiceCara = NP*i+j; caras[indiceCara] = new Cara(4); VerticeNormal** normalesCara = new VerticeNormal*[4]; int verticeBase = indiceCara; int v0 = verticeBase % (NP*NQ); int v1 = sucesor(verticeBase % (NP*NQ)); int v2 = (sucesor(verticeBase)+NP) % (NP*NQ); int v3 = (verticeBase + NP) % (NP*NQ); normalesCara[0] = new VerticeNormal(v0,indiceCara); normalesCara[1] = new VerticeNormal(v1,indiceCara); normalesCara[2] = new VerticeNormal(v2,indiceCara); normalesCara[3] = new VerticeNormal(v3,indiceCara); caras[indiceCara]->addVerticeNormal(normalesCara); } } //Calculamos las normales de cada cara for(int i=0; i<numCaras; i++){ normales[i] = CalculoVectorNormalPorNewell(caras[i]); } }
PV3D* MontanaRusa::vNormal(GLfloat t){ PV3D* bin = vBinormal(t); PV3D* tang = vTangente(t); PV3D* norm = bin->productoVectorial(tang); norm->normaliza(); return norm; }
PV3D* MontanaRusa::vBinormal(GLfloat t){ PV3D* deriv1 = new PV3D(-3 * sin(t), 6 * cos(2 * t), 3 * cos(t), 0); PV3D* deriv2 = new PV3D(-3 * cos(t), -12 * sin(2 * t), -3 * sin(t), 0); PV3D* bin = deriv1->productoVectorial(deriv2); bin->normaliza(); return bin; }
void MontanaRusa::dibujaCoche(){ GLfloat movimiento = coche->getMovimiento(); PV3D* T = primeraDerivada(movimiento); T->normaliza(); PV3D* B = primeraDerivada(movimiento)->productoVectorial(segundaDerivada(movimiento)); B->normaliza(); PV3D* N = B->productoVectorial(T); PV3D* C = funcion(movimiento); GLfloat m[] = { N->getX(), N->getY(), N->getZ(), N->isPoint(), B->getX(), B->getY(), B->getZ(), B->isPoint(), T->getX(), T->getY(), T->getZ(), T->isPoint(), C->getX(), C->getY(), C->getZ(), C->isPoint()}; glMatrixMode(GL_MODELVIEW); glPushMatrix(); glMultMatrixf(m); coche->dibuja(); glPopMatrix(); }
PV3D* Malla::calculoVectorNormalPorNewell(Cara C){ PV3D* n = new PV3D(0, 0, 0, 0); for (int i = 0; i < C.getNumeroVertices(); i++){ PV3D* vertActual = vertice[C.getIndiceVertice(i)]; PV3D* vertSiguiente = vertice[C.getIndiceVertice((i + 1) % C.getNumeroVertices())]; n->setX(n->getX() + ((vertActual->getY() - vertSiguiente->getY())*(vertActual->getZ() + vertSiguiente->getZ()))); n->setY(n->getY() + ((vertActual->getZ() - vertSiguiente->getZ())*(vertActual->getX() + vertSiguiente->getX()))); // Z * X n->setZ(n->getZ() + ((vertActual->getX() - vertSiguiente->getX())*(vertActual->getY() + vertSiguiente->getY()))); // X * Y } return n->normaliza(); }
PV3D* Malla::vectorNormalNewell(Cara* c){ PV3D* n = new PV3D(); for(int i=0; i<c->getNumVertices(); i++){ PV3D* vertActual = vertice[c->getIndiceVerticeK(i)]; PV3D* vertSig = vertice[c->getIndiceVerticeK((i+1) % c->getNumVertices())]; n->setX(n->getX() + ((vertActual->getY() - vertSig->getY()) * (vertActual->getZ() + vertSig->getZ()))); n->setY(n->getY() + ((vertActual->getZ() - vertSig->getZ()) * (vertActual->getX() + vertSig->getX()))); n->setZ(n->getZ() + ((vertActual->getX() - vertSig->getX()) * (vertActual->getY() + vertSig->getY()))); } return n->normaliza(); }
void key(unsigned char key, int x, int y){ float angleLamp; bool need_redisplay = true; switch (key) { case 27: /* Escape key */ //continue_in_main_loop = false; // (**) //Freeglut's sentence for stopping glut's main loop (*) glutLeaveMainLoop (); break; /*case 'a': //Eje X angleX += 1.0; break; case 'z': //Eje X angleX -= 1.0; break; case 's': //Eje Y angleY += 1.0; break; case 'x': //Eje Y angleY -= 1.0; break; case 'd': //Eje Z angleZ += 1.0; break; case 'c': //Eje Z angleZ -= 1.0; break;*/ case 'u': //roll camera.roll(0.09); //0.09 radianes = 5 grados break; case 'i': camera.roll(-0.09); break; case 'j': //yaw camera.yaw(0.01); break; case 'k': camera.yaw(-0.01); break; case 'n': //pitch camera.pitch(0.01); break; case 'm': camera.pitch(-0.01); break; case 'e': //Along axis X recorridoX = 10.0; recorridoY = 0.0; recorridoZ = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 'r': recorridoX = -10.0; recorridoY = 0.0; recorridoZ = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 'd': //Along axis Y recorridoY = 10.0; recorridoX = 0.0; recorridoZ = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 'f': recorridoY = -10.0; recorridoX = 0.0; recorridoZ = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 'c': //Along axis Z recorridoZ = 10.0; recorridoX = 0.0; recorridoY = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 'v': recorridoZ = -10.0; recorridoX = 0.0; recorridoY = 0.0; camera.recorridoEje(recorridoX, recorridoY, recorridoZ); break; case 's': //Desplazar desplazaY = 2.0; camera.desplazar(0.0, desplazaY, 0.0); break; case 'x': desplazaY = -2.0; camera.desplazar(0.0, desplazaY, 0.0); break; case '1': //Gira X //angleGiraX += 0.1; camera.giraX(0.1); break; case '2': //Gira Y //angleGiraY += 0.1; camera.giraY(0.1); break; case '3': //Gira Z //angleGiraZ += 0.1; camera.giraZ(0.1); break; case '4': //Lateral camera.lateral(); break; case '5': //Frontal camera.frontal(); break; case '6': //Cenital camera.cenital(); break; case '7': //Esquina camera.esquina(); break; case 'o': //Ortogonal glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(xLeft, xRight, yBot, yTop, N, F); break; case 'p': //Perspectiva glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, 1, N, F); break; case 'l': //Oblicua glMatrixMode(GL_PROJECTION); glLoadIdentity(); d.normaliza(); if(d.getZ() != 0.0 && (d.getX() != 0 || d.getY() != 0 || d.getZ() != 1)){ GLfloat m[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; m[8] = -(d.getX()) / d.getZ(); m[9] = -(d.getY()) / d.getZ(); m[12] = -N * (d.getX() / d.getZ()); m[13] = -N * (d.getY() / d.getZ()); glOrtho(xLeft, xRight, yBot, yTop, N, F); glMultMatrixf(m); } break; case 'y': //Trasladar escena escena->traslacionEscena(1, 0, 0); break; case 'h': escena->traslacionEscena(-1, 0, 0); break; case 'g': //Escalacion escena escena->escalacionEscena(1, 2, 1); break; case 'b': escena->escalacionEscena(1, 0.5, 1); break; case '8': //Rotacion escena escena->rotacionEscena(2,0,1,0); break; case '9': escena->rotacionEscena(-2,0,1,0); break; case 't': //Encender/apagar luz ambiente global if(globalOn){ globalOn = false; glDisable(GL_LIGHT0); glDisable(GL_LIGHT1); glDisable(GL_LIGHT2); GLfloat amb[] = {0.0,0.0,0.0,1.0}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb); } else { globalOn = true; glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); GLfloat amb[] = {0.2,0.2,0.2,1.0}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb); } break; case 'a': //Escalar lámpara escena->getHijo(15)->getTAfin()->escalacion(1, 1.1, 1); escena->getHijo(15)->getTAfin()->traslacion(0, -1, 0); lampHeight *= 1.1; angleLamp = calculateLampAngle(0.5, lampHeight); glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, angleLamp); break; case 'z': escena->getHijo(15)->getTAfin()->escalacion(1, 0.9, 1); escena->getHijo(15)->getTAfin()->traslacion(0, 1, 0); lampHeight *= 0.9; angleLamp = calculateLampAngle(0.5, lampHeight); glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, angleLamp); break; case 'q': //Encender/apagar lámpara if(lamparaOn){ lamparaOn = false; glDisable(GL_LIGHT1); } else { lamparaOn = true; glEnable(GL_LIGHT1); } break; case 'w': // Activar/desactivar luz remota del este if(luzRemotaOn){ luzRemotaOn = false; glDisable(GL_LIGHT2); } else { luzRemotaOn = true; glEnable(GL_LIGHT2); } break; case '0': // Activar/desactivar niebla if(nieblaOn){ nieblaOn = false; glDisable(GL_FOG); } else { nieblaOn = true; glEnable(GL_FOG); } break; default: need_redisplay = false; break; } if (need_redisplay) glutPostRedisplay(); }