Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porPaca Baros Modificado hace 11 años
1
Curvas y Superficies Referencia – capítulo 11 del Libro Rojo
2
Curvas de Bézier La curvas de Bezier son ecuaciones cúbicas definidas por cuatro puntos: (X0,Y0) (X1,Y1) (X2,Y2) y (X3,Y3) (X0,Y0) y (x3,Y3) son los extremos de la curva Mientras que (X1,Y1) y (X2,Y2) son los puntos de control.
3
Curvas de Bézier Curva de Bézier
4
Curvas de Bézier Ecuaciones x(t) = a x t 3 + b x t 2 + c x t + x 0 y(t) = a y t 3 + b y t 2 + c y t + y 0 c x = 3 (x 1 - x 0 ) b x = 3 (x 2 - x 1 ) - c x a x = x 3 - x 0 - c x - b x c y = 3 (y 1 - y 0 ) b y = 3 (y 2 - y 1 ) - c y a y = y 3 - y 0 - c y - b y
5
Lineas directoras La curva sale con la direccion de la linea P0-P1 y llega con la direccion de la linea P2-P3. El largo de cada linea determina la influencia de esa linea directora. La curva queda dentro del quadrangulo formado por los 4 puntos.
6
Curva en S
7
Curva con loop
8
Otras curvas
9
Función glMap1() Para definir una curva de Bézier usamos la función glMap1() de la forma: void glMap1x(GLenum Modo, xu1, xu2, GLint paso, GLint orden, const x*puntos); x es f(loat) o d(ouble)
10
Función glMap1() Ej. glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4,&ctrlpoints[0][0]); El modo produce vertices de 3 coordenadas, evaluadas entre 0 y 1(0 es el inicio y 1 es el fin), usando un paso de 3, cúbica (el orden es N+1), usando los puntos dados por el arreglo ctrlpoints.
11
Función glEvalCoord1f() Para dibujar la curva de Bézier usamos la función: void glEvalCoord1x( u ) Esta función equivale a usar glVertex(). El parámetro u debe estar entre los valores de u1 y u2 usados en glMap1()
12
Ejemplo – programa Bezier #include //header para windows #include #include //header para GLUT #pragma comment( linker, "/subsystem:\"windows\ /entry:\"mainCRTStartup\"" ) // Los 4 puntos de la curva de bezier GLfloat ctrlpoints[4][3] = { { -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}}; static void redraw(void); int main(int argc, char **argv);
13
Ejemplo – programa Bezier int main(int argc, char **argv) { glutInit(&argc,argv); //inicializa el andamiaje de GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowPosition(100,100); //posicion inicial para la ventana glutInitWindowSize(400,400); //y tamaño glutCreateWindow("Bezier"); //crear la ventana glutDisplayFunc(redraw); //Registrar la funcion de dibujar glClearColor(0.0, 0.0, 0.0, 1.0); // Espcificamos como generar la curva glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4,&ctrlpoints[0][0]); glEnable(GL_MAP1_VERTEX_3);
14
Ejemplo – programa Bezier glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-5.0, 5.0, -5.0, 5.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutMainLoop(); // Pasamos control al "loop" de GLUT return 0; } // Fin del Programa Principal
15
Ejemplo – programa Bezier static void redraw(void) { int i; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); //Esta parte dibuja la curva glBegin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) glEvalCoord1f((GLfloat) i/30.0); glEnd(); //Esta dibuja los 4 puntos glPointSize(5.0); //Tamaño de los puntos a dibujar glColor3f(1.0, 1.0, 0.0); glBegin(GL_POINTS); for (i = 0; i < 4; i++) glVertex3fv(&ctrlpoints[i][0]); glEnd(); glFlush(); glutSwapBuffers(); }
16
Superficies – 2D En 2 dimensiones es similar. Se usa glMap2() en lugar de glMap1() y glEvalCoord2x(u,v) en lugar de glEvalCoord1x(u) El resultado sera una superficie Bezier
17
Ejemplo EL arreglo de puntos es ahora de 4 x 4 x3: GLfloat ctrlpoints[4][4][3] = { {{ -1.5, -1.5, 4.0}, { -0.5, -1.5, 2.0}, {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}}, {{ -1.5, -0.5, 1.0}, { -0.5, -0.5, 3.0}, {0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}}, {{ -1.5, 0.5, 4.0}, { -0.5, 0.5, 0.0}, {0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}}, {{ -1.5, 1.5, -2.0}, { -0.5, 1.5, -2.0}, {0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}};
18
Ejemplo // Tambien cambia al generar la curva glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]); glEnable(GL_MAP2_VERTEX_3); glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLAT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0,5.0);
19
Ejemplo En Redraw: glPushMatrix (); glRotatef(45.0, 1.0, 1.0, 1.0); for (j = 0; j <= 8; j++) { glBegin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0); glEnd(); glBegin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0); glEnd(); } glPopMatrix ();
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.