PDA

View Full Version : How to reset Transformations



VikingMacabro
04-30-2017, 05:16 PM
Im new in opengl. Im using keyboardfunc, when press "+" make my polygons bigger, i want to press "Home" to undo all my changes and get back to original position and size.


// Quadrado.c - Isabel H. Manssour
// Um programa OpenGL simples que desenha um
// quadrado em uma janela GLUT.
// Este código está baseado no GLRect.c, exemplo
// disponível no livro "OpenGL SuperBible",
// 2nd Edition, de Richard S. e Wright Jr.

#include <windows.h>
#include <gl/glut.h>

GLfloat escala = 1;
GLfloat movx, movy = 0;
GLfloat win;


// Função callback chamada para fazer o desenho
void Desenha(void)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Limpa a janela de visualização com a cor de fundo especificada
glClear(GL_COLOR_BUFFER_BIT);

// Especifica que a cor corrente é vermelha
// R G B
glColor3f(1.0f, 0.0f, 0.0f);

glPushMatrix();
glTranslatef(movx,movy,0);
glScalef(escala, escala, 0);







// Desenha um quadrado preenchido com a cor corrente
glBegin(GL_TRIANGLES);
glColor3f(1,1,0);
glVertex2f(40,60);
glVertex2f(20,20);
glVertex2f(60,20);
glEnd();

glBegin(GL_TRIANGLES);
glVertex2f(20,20);
glVertex2f(0,-20);
glVertex2f(40,-20);
glEnd();

glBegin(GL_TRIANGLES);
glVertex2f(60,20);
glVertex2f(40,-20);
glVertex2f(80,-20);
glEnd();

glPopMatrix();
// Executa os comandos OpenGL
glFlush();
}

// Inicializa parâmetros de rendering
void Inicializa (void)
{
// Define a cor de fundo da janela de visualização como preta
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

// Função callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
// Evita a divisao por zero
if(h == 0) h = 1;

// Especifica as dimensões da Viewport
glViewport(0, 0, w, h);

// Inicializa o sistema de coordenadas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Estabelece a janela de seleção (left, right, bottom, top)
if (w <= h)
gluOrtho2D (0.0f, 250.0f, 0.0f, 250.0f*h/w);
else
gluOrtho2D (0.0f, 250.0f*w/h, 0.0f, 250.0f);
}
// Função callback chamada para gerenciar eventos do teclado
// para teclas especiais, tais como F1, PgDn e Home
void tecla_especial(GLint tecla, GLint x, GLint y)
{
switch(tecla)
{
case GLUT_KEY_RIGHT: movx++;
break;
case GLUT_KEY_LEFT: movx--;
break;
case GLUT_KEY_HOME:glLoadIdentity();
break;

case GLUT_KEY_UP:
win -= 20;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
break;

case GLUT_KEY_DOWN:
win += 20;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
break;



}
glutPostRedisplay();
}

void teclas(unsigned char tecla, int x, int y)
{

switch(tecla)
{
case 27: // Escape key
case 'q':
exit(0);
break;

case '+':escala=escala*1.5;


break;

case '-':escala=escala*0.5;
break;

}
glutPostRedisplay();

}

// Programa Principal
int main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,350);
glutInitWindowPosition(10,10);
glutCreateWindow("Triforce");
glutDisplayFunc(Desenha);
glutSpecialFunc (tecla_especial);
glutReshapeFunc(AlteraTamanhoJanela);
glutKeyboardFunc(teclas);
Inicializa();
glutMainLoop();
}

Dark Photon
05-01-2017, 05:31 AM
How to reset Transformations

1) Define your transformation setup code in your display function in terms specific parameters
2) Define what "reset" means (in terms of specific values for those parameters)
3) On reset, just change the parameter values to those you defined in #2 and force a redisplay (glutPostRedisplay())