lunes, 22 de octubre de 2007

Previo 8 (LABORATORIO)

1.-¿Qué es una curva/superficie paramétrica?

- Se dice que una curva es paramétrica si se puede expresar en base a una variable que varia en
un rango determinado, generalmente [ 0..n].

Las curvas paramétricas pueden ser expresadas como:


Los componentes de la curva se pueden representar como un vector

matricialmente podemos representa a una curva como:



Una superficie paramétrica es la imagen de una función o transformación r definida en una región R de un plano uv y que tiene valores en el espacio xyz. La imagen bajo r en cada punto (u,v) en R es el punto del espacio xyz con vector de posición.

r(u,v)= x(u,v), y(u,v), z(u,v)

2.-Describa lso resultados aparentes y diferencias entre las familias de curvas:

-Bézier
-Spline
-B-Spline
-β-Spline
-NURBS

-Bézier
Propuestas por Pierre Bezier (Ingeniero Fránces de Reanult)
- Utilizada para el diseño de carrocería de automóviles.
- A diferencia de Hermite que utiliza explícitamente la derivada el primer y último punto, las curvas de Bezier necesitan como restricciones cuatro puntos que son los puntos de control, que define la geometría de la curva.
- Es de fácil implementación y fácil manipulación.
- La curva interpola el primer y último punto, pero aproxima el resto de puntos.
- Los valores de las primeras derivadas paramétricas de una curva de Bezier en los extremos se
pueden calcular a partir de las coordenadas de los puntos de control como:



B-Spline: Las B-splines que se analizarán consisten en segmentos de curva cuyos coeficientes polinomiales dependen de ciertos puntos de control, lo que originará un control local. Así, mover un punto de control afectará solamente a una pequeña parte de la curva.
Las B–splines no interpola ninguno de sus puntos de control.
αB (t) = GB x MB x T



spline: un spline es una curva definida a trozos mediante polinomios. En los problemas de interpolación, se utiliza a menudo la interpolación mediante splines porque da lugar a resultados similares requiriendo solamente el uso de polinomios de bajo grado a la vez que se evitan las oscilaciones, que en la mayoría de las aplicaciones resultan indeseables, que aparecen al interpolar mediante polinomios de grado elevado. Para el ajuste de curvas, los splines se utilizan para aproximar formas complicadas. La simplicidad de la representación y la facilidad de cómputo de los splines los hacen populares para la representación de curvas en informática, particularmente en el terreno de los gráficos por ordenador.

Beta-spline A diferencia de los splines, los beta–splines poseen dos parámetros adicionales denominados bias y tensión, denotados por beta1 y beta2 respectivamente. Estos parámetros afectan de forma global a todos los segmentos (no proporcionan control local) y permiten controlar la uniformidad del spline. En general, proporcionan mayor control sobre la curva, pero se trata de un control global. Los beta-Splines poseen continuidad geométrica G2 y paramétrica C0. Si beta1 = 1, entonces la continuidad paramétrica es C1. Si incrementamos el parámetro de bias beta1 en valores mayores que 1 el spline estará más influenciado por el vector tangente a los puntos. Incrementar el parámetro de tensión beta2 hace que el spline tienda a estirarse hasta parecerse a la linea que une los puntos de control del mismo.

NURBS. Acrónimo inglés de la expresión Non Uniform Rational B-Splines. Modelo matemático muy utilizado en los gráficos por ordenador para generar y representar curvas y superficies.

Las NURBS, B-splines racionales no uniformes, son representaciones matemáticas de geometría en 3D capaces de describir cualquier forma con precisión, desde simples líneas en 2D, círculos, arcos o curvas, hasta los más complejos sólidos o superficies orgánicas de forma libre en 3D. Gracias a su flexibilidad y precisión, se pueden utilizar modelos NURBS en cualquier proceso, desde la ilustración y animación hasta la fabricación.

La geometría NURBS tiene cinco cualidades esenciales que la convierten en la opción ideal para el modelado asistido por ordenador (grado,puntos de control,nodos, nodos y puntos de control, regla del cálculo.


3.-¿Qué familias de curvas/superficies paramétricas están implementadas en opengl? ¿cómo escribimos código que las defina?

Nurbs

void dibujanurbs()
{
int i,j;
float ctrlptos[4][4][3],knots[8]={0,0,0,0,1,1,1,1};
GLUnurbsObj *pnurb=NULL; // Declaración de la variable de objeto NURB
/* Rellenado de unos puntos de control simples*/
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{ ctrlptos[i][j][0]=i;ctrlptos[i][j][1]=j;ctrlptos[i][j][2]=0;}
for(i=0;i<4;i++)ctrlptos[2][i][2]=1;
/* Creacion del Objeto NURB */
pnurb=gluNewNurbsRenderer();
glEnable(GL_AUTO_NORMAL);
//glShadeModel(GL_SMOOTH);
/* Cambio de las propiedaddes del objeto, en este caso la toleracia de error se pone en 20 pixel, esto implica mas o menos poligonización en la visualización*/
gluNurbsProperty(pnurb,GLU_SAMPLING_TOLERANCE, 20.0);
/* Establecemos que quermos ver la NURB en modo alambre*/
gluNurbsProperty(pnurb, GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);
/* Iniciamos el dibujado de la superficie NURB*/
gluBeginSurface(pnurb);
/*Damos los valores de descripcion de la NURB, en este caso 8 knots y grado de los polinomios4*/ gluNurbsSurface(pnurb,8,knots,8,knots,4*3,3,&ctrlptos,4,4,GL_MAP2_VERTEX_3);
gluEndSurface(pnurb);
/* Eliminamos el objeto nurb que creamos*/
gluDeleteNurbsRenderer(pnurb);
}


Bezier:
void dibujar_curvas_bezier()
{
int i,j;
/** Definicion del Mapeo */
glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3, n_pc_c_bezier, &pc_c_bezier[i]);
/*Habilitacion del mapeo a vertices 3D */
glEnable(GL_MAP1_VERTEX_3);
/* Especificación del numero de evaluaciones del mapeo (100 en los valores 0 y 1 del parámetro*/
glMapGrid1d(100,0,1.0);
/*Dibujado de los puntos de la curva de bezier */
glEvalMesh1(GL_LINE,0,100);
/*Tambien se podria hacer asi
glBegin(GL_LINE_STRIP);
for(j=0; j < 100;j++)
glEvalCoord1f(j/100.0);
glEnd(); */
/* Dibujado de la polilinea de control*/
glBegin(GL_LINE_STRIP);
for(j=0;j
glVertex3fv(pc_c_bezier[j]);
glEnd();
/* Dibujado de los puntos de control */
glPointSize(5.0);
glBegin(GL_POINTS);
for(j=0;j
glVertex3fv(pc_c_bezier[j]);
glEnd();
}

No hay comentarios: