La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Curvas y Superficies Referencia – capítulo 11 del Libro Rojo.

Presentaciones similares


Presentación del tema: "Curvas y Superficies Referencia – capítulo 11 del Libro Rojo."— Transcripción de la presentación:

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 ();


Descargar ppt "Curvas y Superficies Referencia – capítulo 11 del Libro Rojo."

Presentaciones similares


Anuncios Google