Transformaciones geometricas en open gl

Iniciado por V_Dan, 16 Septiembre 2012, 06:02 AM

0 Miembros y 1 Visitante están viendo este tema.

V_Dan

Hola!
Es que necesito de su ayuda, tengo un código que me permite girar la figura con un menú, pero lo que pasa es que tiene que Rotar, escalar y Trasladar;
Como hago para que rote pero en su mismo lugar, por que esta me aparece en la esquina de la pantalla y en la escala se me deforma totalmente
Agradezco su ayuda

CÓDIGO: #include <iostream>
#include <GL/glut.h>
#include <stdlib.h>
using namespace std;

int click[2] = {0,0};
void menuaplicacion(int);


void operaciones (float p[2], float p1[2]) //Parámetros de Entrada
{
   float R[3][3]={1,0,0,  0,1,0,  0,0,1};
   p1[0]= R[0][0]*p[0]+ R[0][1]*p[1] + R[0][2]*1;
   p1[1]= R[1][0]*p[0]+ R [1][1]*p[1] + R[1][2]*1;
   return;
}

//Para rotar
        float q0[2]={click
  • , click [1]};
           float q1[2]={click
  • +100, click [1]};
          float q2[2]={click
  • +100, click [1]+100};
          float q3[2]={click
  • +50, click [1]+150};
          float q4[2]={click
  • , click [1]+100};
          


          float b0[2] ,b1[2] ,b2[2],b3[2],b4[2],b5[2], r[2];
          float ang;



    void rotacion2D (float p[2], float p1[2], float ang)
    {
       float R[3][3]={0,0,0,  0,1,0,  0,0,1};
       float theta;

       theta=ang*3.1415/180;


       R[0][0]=cos(theta);
       R[0][1]=-sin(theta);
       R[1][0]=sin(theta);
       R[1][1]=cos(theta);

       p1[0]= R[0][0]*p[0]+ R
  • [1]*p[1] + R[0][2]*1;
       p1[1]= R[1][0]*p[0]+ R [1][1]*p[1] + R[1][2]*1;

       
       return;
    }

    // Para Traslacion

    /*void traslacion2D (float p[2], float p1[2], float s[2])
    {
       float T[3][3]={0,0,0,  0,1,0,  0,0,1};

       T[0][1]=t[0]; //s[0] es tx
       T[1][0]=t[1]; //s[1] es ty

       p1[0]= T[0][0]*p[0]+ T
  • [1]*p[1] + T[0][2]*1;
       p1[1]= T[1][0]*p[0]+ T [1][1]*p[1] + T[1][2]*1;

       float b0[2] ,b1[2] ,b2[2],b3[2],b4[2],b5[2], t[2];
       return;

    }
    */

    //Para Escalado

          float  s[2];


    void escalado2D (float p[2], float p1[2], float s[2])
    {
       float S[3][3]={0,0,0,  0,1,0,  0,0,1};

       S[0][0]=s[0]; //s[0] es sx
       S[1][1]=s[1]; //s[1] es sy

       p1[0]= S[0][0]*p[0]+ S
  • [1]*p[1] + S[0][2]*1;
       p1[1]= S[1][0]*p[0]+ S [1][1]*p[1] + S[1][2]*1;

       
       return;
    }
    //********************************************EMPIEZA FORMALMENTE EL TRABAJO ****************************************************************

    void init(void)
    {
        glClearColor(0.0,0.0,0.0,0.0);
         glMatrixMode(GL_PROJECTION);   
         gluOrtho2D(0.0,500.0,0.0,500.0);
       
        int submenu1,submenu2,submenu3,submenu4;
       

        submenu1=glutCreateMenu(menuaplicacion);
          glutAddMenuEntry("45", 1);
          glutAddMenuEntry("-45", 2);
       
       
        submenu2=glutCreateMenu(menuaplicacion);
          glutAddMenuEntry("Doble", 3);
          glutAddMenuEntry("Mitad", 4);
        

         submenu3=glutCreateMenu(menuaplicacion);
          glutAddMenuEntry("Al Origen", 5);
          glutAddMenuEntry("Posicion Inicial", 6);
       

         submenu4=glutCreateMenu(menuaplicacion);
          glutAddMenuEntry("Retornar Posicion Inicial", 7);
          glutAddMenuEntry("Desde 0", 8);
          

        glutCreateMenu(menuaplicacion);
        glutAddSubMenu("Rotar",submenu1);
       glutAddSubMenu("Escalar",submenu2);
       glutAddSubMenu("Trasladar",submenu3);
       glutAddSubMenu("Reiniciar",submenu4);
       glutAttachMenu(GLUT_RIGHT_BUTTON);
       glutAttachMenu(GLUT_MIDDLE_BUTTON);

    }


    void ejesguia()
    {

        glClear(GL_COLOR_BUFFER_BIT);
         
        glColor3f(0.0,1.0,0.0);
        glBegin(GL_LINES);
        glPointSize(0.8);
             glVertex2i(30,30);     
             glVertex2i(30,470);
             
             glVertex2i(30,30);     
                glVertex2i(470,30);

         glEnd();
         glFlush();
    }


    void mouse(int button, int state, int x=0, int y=0)
    {

       if (state==0) return;
         y =500-y;

       if (state == 1 && click[0]==0 && click[1]==0)
       {
          click
  • =x;
          click [1]=y;
       }

          cout<<"Coordenada en X guardada"<<click[0]<<endl;
           cout<<"Coordenada en Y guardada"<<click[1]<<endl;

          glColor3f (0.73, 0.25, 0.83);
          glBegin (GL_POLYGON);

          glVertex2f(click
  • , click [1]);
          glVertex2f(click
  • +100, click [1]);
          glVertex2f(click
  • +100, click [1]+100);
          glVertex2f(click
  • +50, click [1]+150);
          glVertex2f(click
  • , click [1]+100);

          glEnd ();
          glFlush();
    }

    void menuaplicacion(int value)
    {
       if(value==1)
       {
       // Rota mas 45

       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
          ang= 45;
       
       rotacion2D(q0,b0,ang);
       rotacion2D(q1,b1,ang);
       rotacion2D(q2,b2,ang);
       rotacion2D(q3,b3,ang);
       rotacion2D(q4,b4,ang);
       
       
       glColor3f(0.50,0.21,0.42);
       glBegin(GL_POLYGON);
          glVertex2fv(b0);
          glVertex2fv(b1);
          glVertex2fv(b2);
          glVertex2fv(b3);
          
           
           glEnd();
          glFlush();
          

          

       }


       if(value==2)
       {
       // Rota -45
       
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);

       ang= -45;
       
       rotacion2D(q0,b0,ang);
       rotacion2D(q1,b1,ang);
       rotacion2D(q2,b2,ang);
       rotacion2D(q3,b3,ang);
       rotacion2D(q4,b4,ang);
       
       
       glColor3f(0.50,0.21,0.42);
       glBegin(GL_POLYGON);
          glVertex2fv(b0);
          glVertex2fv(b1);
          glVertex2fv(b2);
          glVertex2fv(b3);
          glVertex2fv(b4);
          glVertex2fv(b5);
           
       glEnd();
          glFlush();
       }

       if(value==3)
       {
       
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
       s[0]=2;
       s[1]=2;

       escalado2D(q0,b0,s);
       escalado2D(q1,b1,s);
       escalado2D(q2,b2,s);
       escalado2D(q3,b3,s);
       escalado2D(q4,b4,s);


       glColor3f(1,1,0);
       glBegin(GL_POLYGON);
          glVertex2fv(b0);
          glVertex2fv(b1);
          glVertex2fv(b2);
          glVertex2fv(b3);
           
       glEnd();
       glFlush();
       

       }
       if(value==4)
       {
       //   Mitad

       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);

       s[0]=0.5;
       s[1]=0.5;

       escalado2D(q0,b0,s);
       escalado2D(q1,b1,s);
       escalado2D(q2,b2,s);
       escalado2D(q3,b3,s);
       escalado2D(q4,b4,s);
       


       glColor3f(1,1,0);
       glBegin(GL_POLYGON);
          glVertex2fv(b0);
          glVertex2fv(b1);
          glVertex2fv(b2);
          glVertex2fv(b3);
           
       glEnd();
       glFlush();
       
       }

       if(value==5)
       {
       // (0;0)
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
       }
       if(value==6)
       {
       // (xo,yo)
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
       
       }

       if(value==7)
       {
       //Posición Inicial
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
       }

       if(value==8)
       {
       // Desde0
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       ejesguia();
       glutMouseFunc(mouse);
       }

    } //  FINMenú

    //Main
    int main (int argc,char** argv)
    {

       int menu, submenu1;

       //iniciacion de GLUT y pantalla
         glutInit(&argc,argv);                     
         glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
         glutInitWindowPosition(50,100);                                                   
       
        glutInitWindowSize(500,500);                                                       
         
        glutCreateWindow("Transformaciones");
        glutMouseFunc(mouse);
        glutDisplayFunc (ejesguia);
        glutReshapeWindow (500,500);

        init(); 
        glutMainLoop();
    }//Findel Main