[Tutorial] III.2 Tamaño de los puntos: glPointSize()

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] III.2 Tamaño de los puntos: glPointSize()

Mensaje  HarZe el Miér Jul 29, 2009 9:55 pm

III.2 El tamaño de los puntos
Novedades:
  • glPointSize()
  • glGetXXXv()


He desarrollado el programa anterior, añadiendo una cosa más. Ahora, pulsando F1 y F2 puedes aumentar y dismunuir el tamaño de los puntos, porque éstos pueden ser escalados hasta cierto punto. Por primero vez vamos a usar también la consola, para recibir un dato del que ahora hablaremos. El nuevo código:
Código:
#include <GL/glut.h>
#include <stdio.h>

float tamanno = 1.0f;
int up, down;
int alto, ancho, f1, f2;
GLfloat t = 1.0f;
GLfloat min_y_max[2];

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,600);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica III,2 de OpenGL");

  //Obetener minimo y maximo de tamaño para los pixeles
  glGetFloatv(GL_POINT_SIZE_RANGE,min_y_max);
  printf("Minimo: %f , maximo: %f",min_y_max[0],min_y_max[1]); //Conoce los limites de tu SO por pixel
}

void PintarEscena() {
   glMatrixMode(GL_MODELVIEW);
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();

   glColor3f(1.0f,1.0f,1.0f);
   glRectf(-5.0f,-5.0f,5.0f, 7.0f);

   glPointSize(t);
   glBegin(GL_POINTS);
      glColor3f(0.5f,0.0f,0.0f);
      glVertex3f(-2.0f,5.0f,0.0f);
      glVertex3f(-2.0f,3.0f,0.0f);
      glVertex3f(-2.0f,1.0f,0.0f);
      glVertex3f(-2.0f,-1.0f,0.0f);
      glVertex3f(-2.0f,-3.0f,0.0f);
      glVertex3f(0.0f,1.0f,0.0f);
      glVertex3f(2.0f,5.0f,0.0f);
      glVertex3f(2.0f,3.0f,0.0f);
      glVertex3f(2.0f,1.0f,0.0f);
      glVertex3f(2.0f,-1.0f,0.0f);
      glVertex3f(2.0f,-3.0f,0.0f);
   glEnd();

   glutSwapBuffers();
}

void ReProyectar(int w, int h) {
   ancho = w;
   alto = 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*tamanno, 10.0f*tamanno, -10.0f*tamanno / formato, 10.0f*tamanno / formato, 1.0f, -1.0f);
    else glOrtho (-10.0f*tamanno * formato, 10.0f*tamanno * formato, -10.0f*tamanno, 10.0f*tamanno, 1.0f, -1.0f);
}

void Zoom(int value) {
   if (up) tamanno = tamanno * 1.01f;
   if (down) tamanno = tamanno / 1.01f;

   ReProyectar(ancho,alto);
    glutTimerFunc(33,Zoom,1);
    glutPostRedisplay();
}

void Flechas(int key, int x, int y) {
   if (key==GLUT_KEY_UP) up = 1;
   if (key==GLUT_KEY_DOWN) down = 1;
   if (key==GLUT_KEY_F1) {
      if ((t + 1) <= min_y_max[1]) t = t + 1.0f;
   }
   if (key==GLUT_KEY_F2) {
      if ((t - 1) >= min_y_max[0]) t = t - 1.0f;
   }
   glutPostRedisplay();
}

void FlechasUp(int key, int x, int y) {
   if (key==GLUT_KEY_UP) up = 0;
   if (key==GLUT_KEY_DOWN) down = 0;
}

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();

  glutReshapeFunc(ReProyectar);
  glutDisplayFunc(PintarEscena);
  glutTimerFunc(33,Zoom,1);
  glutSpecialFunc(Flechas);
  glutSpecialUpFunc(FlechasUp);

  glutMainLoop();
    return 0;
}

A parte de que he añadido el aumento de una variable (t) o su disminución, a las teclas F1 y F2. Solo hay dos novedades, la primera en IniciarGLUT():
Código:
  //Obetener minimo y maximo de tamaño para los pixeles
  glGetFloatv(GL_POINT_SIZE_RANGE,min_y_max);
  printf("Minimo: %f , maximo: %f",min_y_max[0],min_y_max[1]); //Conoce los limites de tu SO por pixel
Con glGetFloatv(GL_POINT_SIZE_RANGE,min_y_max); almacenamos en un array de 2 elementos, que es el segundo argumento, el mínimo y máximo tamaño para un punto en tu sistema; en otras palabras, el rango de tamaño. Esta función no se limita a esto, cambiando el primer argumento obtenemos otros datos.
Para saber éstos datos, la siguiente línea, imprime en la consola (si está abierta), el mínimo y el máximo.

La siguiente novedad es solo una línea, intercalada en PintarEscena(), justo antes de mandar dibujar los puntos, asignamos su tamaño: glPointSize(t); con t. En mi caso, el máximio que me permite es 63.

Aumentando el tamaño, forma una H, prueba a redimensionar, alejar, acercar, cambiar tamaño de punto, etc... y comprobarás que siempre tendrán el mismo tamaño los puntos, un numero de pixeles, que se junten o alejen denpende de cuán cerca lo veas.

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.