[Tutorial] III.4 - Lineas STRIP y LOOP, y cambiar el grosor

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] III.4 - Lineas STRIP y LOOP, y cambiar el grosor

Mensaje  HarZe el Jue Jul 30, 2009 5:39 pm

III.4 Líneas continuadas: STRIP y LOOP, y cambiar el grosor
Novedades:
  • Uso de GL_LINE_STRIP en glBegin()
  • Uso de GL_LINE_LOOP en glBegin()
  • glLineWidth()


Imagina que quieres hacer una línea contínua, definida por mucho puntos. Según el primer método explicado (GL_LINES), lo harías por segmentos, para hacer un cuadrado, necesitas 4 segmentos, cada uno con dos vértices. Pues tenemos dos soluciones alternativas, que mejoran el rendimiento:
- STRIP: se continua la línea punto a punto, si pones 5 puntos, puedes cerrar un cuadrado, de esquina a esquina, volviendo la última vez al origen, repitiendo el último punto.
- LOOP: funciona igual que el anterior, pero une el último vértice con el primero, aquí solo necesitaríamos 4 vértices para un cuadrado. Pero te ves forzado a cerrar el polígono, para hacer curvas es mejor el STRIP.

También cambiaremos el grosor de la línea, como hicimos con el punto.
Código:
#include <GL/glut.h>

GLfloat min_y_max[2];
GLfloat ancho = 1.0f;
int flechas[2];

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,600);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica III,4 de OpenGL");
 
  //Obtener mínimo y máximo de ancho para líneas
  glGetFloatv(GL_LINE_WIDTH_RANGE,min_y_max);
  printf("Minimo: %.1f , maximo: %.1f",min_y_max[0],min_y_max[1]);
}
   
void PintarEscena() {
   glMatrixMode(GL_MODELVIEW);
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();
   
   glColor3f(0,0,0);
   glRectf(-10,-10,10,10);
   
   glLineWidth(ancho);
   
   glColor3f(1,1,1);
   glBegin(GL_LINE_STRIP);
      glVertex3i(-4,7,0);
      glVertex3i(-4,-7,0);
      glVertex3i(4,-7,0);
      glVertex3i(4,4,0);
      glVertex3i(1,7,0);
      glVertex3i(-4,7,0);
   glEnd();
   
   glBegin(GL_LINE_LOOP);
      glVertex3i(-3,4,0);
      glVertex3i(3,4,0);
      glVertex3i(3,-6,0);
      glVertex3i(-3,-6,0);
   glEnd();
   
   glutSwapBuffers();
}

void ReProyectar(int w, int h) {
   GLfloat formato;

   if(h == 0) h = 1;
      
    glViewport(0, 0, w, h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   formato = (GLfloat)w / (GLfloat)h;
    if (w <= h) glOrtho (-10.0f, 10.0f, -10.0f / formato, 10.0f / formato, -1.0f, 1.0f);
    else glOrtho (-10.0f * formato, 10.0f * formato, -10.0f, 10.0f, -1.0f, 1.0f);
}

void Flechas(int key, int x, int y) {
   if (key==GLUT_KEY_UP) flechas[0]=1;
   if (key==GLUT_KEY_DOWN) flechas[1]=1;
}

void FlechasUp(int key, int x, int y) {
   if (key==GLUT_KEY_UP) flechas[0]=0;
   if (key==GLUT_KEY_DOWN) flechas[1]=0;
}

void CambiarAncho(int value) {
   if (flechas[0]) if ((ancho + 1)<=min_y_max[1]) ancho = ancho + 1;
   if (flechas[1]) if ((ancho - 1)>=min_y_max[0]) ancho = ancho - 1;
   
   glutTimerFunc(33,CambiarAncho,1);
   glutPostRedisplay();
}

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();
 
  glutReshapeFunc(ReProyectar);
  glutDisplayFunc(PintarEscena);
  glutIdleFunc(PintarEscena);
  glutSpecialFunc(Flechas);
  glutSpecialUpFunc(FlechasUp);
  glutTimerFunc(33,CambiarAncho,1);
 
  glutMainLoop();
    return 0;
}

Flecha arriba, flecha abajo, y cambiarás el grosor de las líneas. En cuanto a los nuevos tipos de líneas, ya los he explicado arriba. STRIP es cadena, es como acer una línea articulada. LOOP es como STRIP, pero cerrando la línea.
Usamos glGetFloatv(GL_LINE_WIDTH_RANGE,min_y_max); para obtener, como hicimos con el punto, el máximo grosor posible. Después asignamos el grosor con: glLineWidth(ancho);
Este tutorial es muy corto de explicar, porque es mas bien un ejemplo de algo bastante sencillo.

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.