{"id":77,"date":"2022-03-23T22:08:49","date_gmt":"2022-03-23T22:08:49","guid":{"rendered":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/"},"modified":"2022-03-23T22:08:49","modified_gmt":"2022-03-23T22:08:49","slug":"transformacoes-geometricas","status":"publish","type":"page","link":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/","title":{"rendered":"Transforma\u00e7\u00f5es geom\u00e9tricas"},"content":{"rendered":"<p>&#013;<\/p>\n<div class=\"NAVHEADER\">&#013;<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<th align=\"middle\" colspan=\"3\">Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013;<br \/>\nOpenGL<\/th>\n<\/tr>\n<p>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"bottom\" align=\"left\" width=\"10%\"><a href=\"transformacoes.html\">Prev<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"bottom\" align=\"middle\" width=\"80%\" \/>&#013;<\/p>\n<td valign=\"bottom\" align=\"right\" width=\"10%\"><a href=\"transformacoes-outros.html\">Next<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<hr align=\"left\" width=\"100%\" \/>&#013;\n<\/div>\n<p>&#013;<\/p>\n<div class=\"CHAPTER\">&#013;<\/p>\n<h1><a name=\"TRANSFORMACOES\">4.2. Transforma\u00e7\u00f5es geom\u00e9tricas &#8211; bra\u00e7o rob\u00f3tico<\/a><\/h1>\n<p>&#013;<\/p>\n<p>O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 compreender como as transforma\u00e7\u00f5es geom\u00e9tricas s\u00e3o &#013;<br \/>\nrealizadas sobre os objetos em rela\u00e7\u00e3o a um determinado sistema de coordenadas. &#013;<br \/>\nNo OpenGL existem fun\u00e7\u00f5es para realizar transla\u00e7\u00e3o, rota\u00e7\u00e3o e escalamento, &#013;<br \/>\nbastando apenas ao usu\u00e1rio ajustar os seus par\u00e2metros para obter o efeito &#013;<br \/>\ndesejado. Ser\u00e1 analisado um modelo simples de um bra\u00e7o rob\u00f3tico, constitu\u00eddo de &#013;<br \/>\nbra\u00e7o e antebra\u00e7o, como mostra a <a href=\"transformacoes.html#FIG-BRACO\">Figura &#013;<br \/>\n4-1<\/a><\/p>\n<p>&#013;<\/p>\n<div class=\"FIGURE\">&#013;<\/p>\n<p><b><a name=\"FIG-BRACO\">Figura 4-1. Bra\u00e7o rob\u00f3tico<\/a><\/b><\/p>\n<p>&#013;<\/p>\n<p \/><font color=\"red\"><font color=\"red\"><font color=\"red\" \/><\/font><\/font>&#013;<\/p>\n<p><img decoding=\"async\" src=\"braco.jpg\" \/><\/p>\n<\/div>\n<p>&#013;<\/p>\n<p> <b>ATEN\u00c7\u00c3O: <\/b>Como este programa inclui movimentos de rota\u00e7\u00e3o a partir de eixos&#013;<br \/>\nbem definidos, recomeda-se que o aluno veja primeiro o programa <a href=\"cubos4.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">cubos4.c<\/tt><\/a>,&#013;<br \/>\napresentado na Se\u00e7\u00e3o <a href=\"transformacoes-outros.html\">Outros programas relacionados<\/a>.<\/p>\n<p>&#013;\n<\/p>\n<p>O programa que implementa o bra\u00e7o rob\u00f3tico \u00e9 mostrado no <a href=\"transformacoes.html#EXAMPLE-BRACO\">Exemplo &#013;<br \/>\n4-1<\/a>. As teclas <b class=\"KEYCAP\">s<\/b> e <b class=\"KEYCAP\">S<\/b> servem para &#013;<br \/>\ngirar o ombro do bra\u00e7o rob\u00f3tico (<i class=\"FOREIGNPHRASE\">shoulder<\/i>) para um &#013;<br \/>\nlado e para o outro; as teclas <b class=\"KEYCAP\">e<\/b> e <b class=\"KEYCAP\">E<\/b>, &#013;<br \/>\npor sua vez, controlam o giro do cotovelo (<i class=\"FOREIGNPHRASE\">elbow<\/i>). &#013;<br \/>\nPara finalizar o programa, basta digitar <b class=\"KEYCAP\">ESC<\/b>. As teclas e &#013;<br \/>\nsuas respectivas a\u00e7\u00f5es est\u00e3o definidas na fun\u00e7\u00e3o <tt class=\"FUNCTION\">keyboard()<\/tt>.<\/p>\n<p>&#013;<\/p>\n<div class=\"EXAMPLE\">&#013;<\/p>\n<p><b><a name=\"EXAMPLE-BRACO\">Exemplo 4-1. programa <\/a><a href=\"braco.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">braco.c<\/tt><\/a><\/b><\/p>\n<p>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">#include &lt;GL\/glut.h&gt;&#013;\n#include &lt;stdlib.h&gt;&#013;\n&#013;\nstatic int shoulder = 0, elbow = 0;&#013;\n&#013;\nvoid init(void){&#013;\n  glClearColor (0.0, 0.0, 0.0, 0.0);&#013;\n}&#013;\n&#013;\nvoid display(void){&#013;\n  glClear (GL_COLOR_BUFFER_BIT);&#013;\n  glPushMatrix();&#013;\n&#013;\n  \/* origem posicionada no ombro *\/&#013;\n  glTranslatef (-1.0, 0.0, 0.0);&#013;\n  glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);&#013;\n&#013;\n  \/* origem posicionada no centro do bra\u00e7o *\/ &#013;\n  glTranslatef (1.0, 0.0, 0.0);&#013;\n  glPushMatrix();&#013;\n  glScalef (2.0, 0.4, 1.0);&#013;\n  glutWireCube (1.0);&#013;\n  glPopMatrix();&#013;\n   &#013;\n  \/* origem posicionada no cotovelo *\/&#013;\n  glTranslatef (1.0, 0.0, 0.0);&#013;\n  glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);&#013;\n  glTranslatef (1.0, 0.0, 0.0);&#013;\n  glPushMatrix();&#013;\n  glScalef (2.0, 0.4, 1.0);&#013;\n  glutWireCube (1.0);&#013;\n  glPopMatrix();&#013;\n&#013;\n  \/* origem volta para o sistema de coordenadas original *\/&#013;\n  glPopMatrix();&#013;\n  glutSwapBuffers();&#013;\n}&#013;\n&#013;\nvoid reshape (int w, int h){&#013;\n  glViewport (0, 0, (GLsizei) w, (GLsizei) h);&#013;\n  glMatrixMode (GL_PROJECTION);&#013;\n  glLoadIdentity ();&#013;\n  gluPerspective(65.0, (GLfloat) w\/(GLfloat) h, 1.0, 20.0);&#013;\n  glMatrixMode(GL_MODELVIEW);&#013;\n  glLoadIdentity();&#013;\n  glTranslatef (0.0, 0.0, -5.0);&#013;\n}&#013;\n&#013;\nvoid keyboard (unsigned char key, int x, int y){&#013;\n  switch (key) {&#013;\n  case 's':&#013;\n    shoulder = (shoulder + 5) % 360;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 'S':&#013;\n    shoulder = (shoulder - 5) % 360;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 'e':&#013;\n    elbow = (elbow + 5) % 360;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 'E':&#013;\n    elbow = (elbow - 5) % 360;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 27:&#013;\n    exit(0);&#013;\n    break;&#013;\n  default:&#013;\n    break;&#013;\n  }&#013;\n}&#013;\n&#013;\nint main(int argc, char** argv){&#013;\n  glutInit(&amp;argc, argv);&#013;\n  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);&#013;\n  glutInitWindowSize (500, 500); &#013;\n  glutInitWindowPosition (100, 100);&#013;\n  glutCreateWindow (argv[0]);&#013;\n  init ();&#013;\n  glutDisplayFunc(display); &#013;\n  glutReshapeFunc(reshape);&#013;\n  glutKeyboardFunc(keyboard);&#013;\n  glutMainLoop();&#013;\n  return 0;&#013;\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>&#013;<\/p>\n<p>Para compilar e executar o programa <a href=\"braco.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">braco.c<\/tt><\/a>, salve-o juntamente com o &#013;<br \/>\narquivo <a href=\"Makefile\" target=\"_top\" rel=\"noopener\">Makefile<\/a> em um diret\u00f3rio e execute a seguinte seq\u00fc\u00eancia de &#013;<br \/>\ncomandos:<\/p>\n<p>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"SCREEN\"><tt class=\"PROMPT\">$<\/tt> <b class=\"COMMAND\">make<\/b> <span class=\"OPTION\">braco<\/span>&#013;\n<tt class=\"PROMPT\">$<\/tt> <b class=\"COMMAND\">.\/braco<\/b><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<div class=\"SECT1\">&#013;<\/p>\n<h1 class=\"SECT1\"><a name=\"TRANSFORMACOES-DESCRICAO\">4.2.1. Descri\u00e7\u00e3o do programa <tt class=\"FILENAME\">braco.c<\/tt><\/a><\/h1>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">static int shoulder = 0, elbow = 0;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>As vari\u00e1veis <font color=\"red\">shoulder<\/font> e <font color=\"red\">elbow<\/font> &#013;<br \/>\nguardam o \u00e2ngulo de rota\u00e7\u00e3o do ombro e o \u00e2ngulo formado entre o bra\u00e7o e o &#013;<br \/>\nantebra\u00e7o do rob\u00f4, respectivamente.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void display(void)&#013;\n{&#013;\n  glClear (GL_COLOR_BUFFER_BIT);&#013;\n  glPushMatrix();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Uma vez que as transforma\u00e7\u00f5es geom\u00e9tricas no espa\u00e7o s\u00e3o representadas por &#013;<br \/>\nmatrizes, o uso de uma pilha de matrizes de transforma\u00e7\u00e3o ajuda a lembrar a &#013;<br \/>\nseq\u00fc\u00eancia de transforma\u00e7\u00f5es realizadas. No OpenGL, esta facilidade \u00e9 provida &#013;<br \/>\npelas fun\u00e7\u00f5es <tt class=\"FUNCTION\">glPushMatrix()<\/tt>, que insere a matriz de &#013;<br \/>\ntransforma\u00e7\u00e3o corrente na pilha, e <tt class=\"FUNCTION\">glPopMatrix()<\/tt>, que &#013;<br \/>\nretira a matriz do topo da pilha e torna esta \u00faltima a matriz de transforma\u00e7\u00e3o &#013;<br \/>\ncorrente. Neste exemplo, a fun\u00e7\u00e3o <tt class=\"FUNCTION\">glPushMatrix()<\/tt> serve &#013;<br \/>\npara lembrar os par\u00e2metros de transla\u00e7\u00e3o, rota\u00e7\u00e3o e escalamento no in\u00edcio das &#013;<br \/>\nopera\u00e7\u00f5es de desenho.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glTranslatef (-1.0, 0.0, 0.0);&#013;\n  glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);&#013;\n  glTranslatef (1.0, 0.0, 0.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A origem do sistema de coordenadas \u00e9 levado para o ponto (x,y,z)=(-1,0,0) &#013;<br \/>\natrav\u00e9s da fun\u00e7\u00e3o <tt class=\"FUNCTION\">glTranslatef()<\/tt>, definindo a coordenada &#013;<br \/>\nde origem (piv\u00f4) para o ombro do bra\u00e7o rob\u00f3tico. Em seguida, usando a fun\u00e7\u00e3o <tt class=\"FUNCTION\">glRotatef()<\/tt>, o sistema de coordenadas \u00e9 rotacionado de modo, &#013;<br \/>\ndefinindo a orienta\u00e7\u00e3o do bra\u00e7o.<\/p>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glRotate()<\/tt> possui o seguinte prot\u00f3tipo:<\/p>\n<p>&#013;<\/p>\n<div class=\"FUNCSYNOPSIS\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<p><code><code class=\"FUNCDEF\">void glRotate<\/code>(GLfloat angle, GLfloat x, &#013;<br \/>\nGLfloat y, GLfloat z);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Quando chamada, <tt class=\"FUNCTION\">glRotate()<\/tt> efetua uma rota\u00e7\u00e3o de <tt class=\"PARAMETER\"><i>angle<\/i><\/tt> graus no sistema de coordenadas na dire\u00e7\u00e3o &#013;<br \/>\ncontra o sentido do rel\u00f3gio em torno de um vetor que vai da origem ao ponto &#013;<br \/>\n(x,y,z)<\/p>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glTranslatef()<\/tt>, por sua vez, retorna a &#013;<br \/>\norigem do sistema de coordenadas para o centro do bra\u00e7o. As etapas desta &#013;<br \/>\ntransforma\u00e7\u00e3o s\u00e3o mostradas na <a href=\"transformacoes.html#FIG-BRACO-1\">Figura &#013;<br \/>\n4-2<\/a>.<\/p>\n<p>&#013;<\/p>\n<div class=\"FIGURE\">&#013;<\/p>\n<p><b><a name=\"FIG-BRACO-1\">Figura 4-2. Transforma\u00e7\u00e3o para desenho do &#013;<br \/>\nbra\u00e7o<\/a><\/b><\/p>\n<p>&#013;<\/p>\n<p><img decoding=\"async\" src=\"braco-1.jpg\" \/><\/p>\n<\/div>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glPushMatrix();&#013;\n  glScalef (2.0, 0.4, 1.0);&#013;\n  glutWireCube (1.0);&#013;\n  glPopMatrix();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Mais uma vez, a matriz de transforma\u00e7\u00e3o corrente \u00e9 armazenada na pilha, agora &#013;<br \/>\npara restringir o efeito da fun\u00e7\u00e3o <tt class=\"FUNCTION\">glScale()<\/tt>. A fun\u00e7\u00e3o &#013;<br \/>\n<tt class=\"FUNCTION\">glScale()<\/tt> altera a escala dos eixos x, y e z. A fun\u00e7\u00e3o &#013;<br \/>\n<tt class=\"FUNCTION\">glutWireCube()<\/tt> desenha um cubo centrado na origem do &#013;<br \/>\nsistema de coordenadas com aresta de tamanho unit\u00e1rio, conforme o argumento que &#013;<br \/>\nlhe foi passado. Quando a fun\u00e7\u00e3o <tt class=\"FUNCTION\">glPopMatrix()<\/tt> \u00e9 &#013;<br \/>\nchamada, a matriz de transforma\u00e7\u00e3o do topo da pilha passa a vigorar, fazendo com &#013;<br \/>\nque o cubo seja distorcido, assumindo a forma de um parelep\u00edpedo. A origem do &#013;<br \/>\nsistema de coordenadas volta a ser o centro do bra\u00e7o.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glTranslatef (1.0, 0.0, 0.0);&#013;\n  glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);&#013;\n  glTranslatef (1.0, 0.0, 0.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A origem do sistema de coordenadas \u00e9 levada agora para a ponta do bra\u00e7o com a &#013;<br \/>\nfun\u00e7\u00e3o <tt class=\"FUNCTION\">glTranslate()<\/tt>, demarcando o novo piv\u00f5 para &#013;<br \/>\nrota\u00e7\u00e3o: o cotovelo do rob\u00f4. A rota\u00e7\u00e3o \u00e9 realizada com a fun\u00e7\u00e3o <tt class=\"FUNCTION\">glRotate()<\/tt> e em seguida a origem do sistema de coordenadas \u00e9 &#013;<br \/>\nlevada para o centro do antebra\u00e7o, via <tt class=\"FUNCTION\">glTranslate()<\/tt>.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glPushMatrix();&#013;\n  glScalef (2.0, 0.4, 1.0);&#013;\n  glutWireCube (1.0);&#013;\n  glPopMatrix();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>O antebra\u00e7o \u00e9 desenhado de forma semelhante ao bra\u00e7o: as escalas dos eixos &#013;<br \/>\ncoordenados s\u00e3o ajustadas e o cubo de aresta 1 \u00e9 desenhado, sempre preservando &#013;<br \/>\nas dimens\u00f5es do sistema de coordenadas original.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glPopMatrix();&#013;\n  glutSwapBuffers();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glPopMatrix()<\/tt> remove a matriz de &#013;<br \/>\ntransforma\u00e7\u00e3o do topo da pilha, fazendo-a corrente, retornando assim o sistema &#013;<br \/>\nde coordenadas original. Quando <tt class=\"FUNCTION\">glutSwapBuffers()<\/tt> \u00e9 &#013;<br \/>\nchamada, os buffers de desenho e de apresenta\u00e7\u00e3o s\u00e3o alternados e a nova imagem &#013;<br \/>\ndo bra\u00e7o rob\u00f3tico \u00e9 apresentada.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">void reshape (int w, int h)&#013;\n{&#013;\n  glViewport (0, 0, (GLsizei) w, (GLsizei) h); <\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Define a \u00e1rea dentro da janela de desenho no sistema de coordenadas atual, &#013;<br \/>\norigem (x,y), largura (w) e altura (h), que OpenGL pode utilizar para efetuar &#013;<br \/>\ndesenhos. Este trecho de c\u00f3digo permite que toda a \u00e1rea da janela possa ser &#013;<br \/>\nutilizada quando a janela sofrer redimensionamento.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glMatrixMode (GL_PROJECTION);&#013;\n  glLoadIdentity ();&#013;\n  gluPerspective(65.0, (GLfloat) w\/(GLfloat) h, 1.0, 20.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glMatrixMode()<\/tt> especifica a pilha de &#013;<br \/>\nmatrizes que ser\u00e1 o alvo das opera\u00e7\u00f5es matriciais subseq\u00fcentes; neste caso, a &#013;<br \/>\npilha de matrizes de proje\u00e7\u00e3o. A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glLoadIdentity()<\/tt> &#013;<br \/>\ninicia a matriz de proje\u00e7\u00e3o corrente como a matriz identidade. A fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluPerspective()<\/tt> define a transforma\u00e7\u00e3o de perspectiva usada &#013;<br \/>\nno exemplo. Proje\u00e7\u00f5es geom\u00e9tricas n\u00e3o s\u00e3o alvo desta li\u00e7\u00e3o e por enquanto n\u00e3o &#013;<br \/>\nser\u00e3o estudadas.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glMatrixMode(GL_MODELVIEW);&#013;\n  glLoadIdentity();&#013;\n  glTranslatef (0.0, 0.0, -5.0);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glMatrixMode()<\/tt> especifica agora que a pilha &#013;<br \/>\nde matrizes de <i class=\"FOREIGNPHRASE\">modelview<\/i>, usadas para definir &#013;<br \/>\ntransla\u00e7\u00e3o, rota\u00e7\u00e3o e escalamento, ser\u00e1 o alvo das transforma\u00e7\u00f5es subseq\u00fcentes. &#013;<br \/>\nA fun\u00e7\u00e3o <tt class=\"FUNCTION\">glLoadIdentity()<\/tt> inicia a matriz de <i class=\"FOREIGNPHRASE\">modelview<\/i> corrente como a matriz identidade. Finalmente, &#013;<br \/>\no objeto \u00e9 deslocado -5 unidades para o fundo da tela, melhorando a sua &#013;<br \/>\nvisualiza\u00e7\u00e3o.<\/p>\n<p>&#013;<\/p>\n<div class=\"INFORMALEXAMPLE\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<table width=\"100%\" bgcolor=\"#e0e0e0\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td>\n<pre class=\"PROGRAMLISTING\">  glutReshapeFunc(reshape);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Especifica a fun\u00e7\u00e3o de retorno para redimensionamento de janela, possuindo o &#013;<br \/>\nseguinte prot\u00f3tipo:<\/p>\n<p>&#013;<\/p>\n<div class=\"FUNCSYNOPSIS\">&#013;<\/p>\n<p \/>&#013;<\/p>\n<p><code><code class=\"FUNCDEF\">funcao<\/code>(int width, int height);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<\/div>\n<\/div>\n<p>&#013;<\/p>\n<div class=\"NAVFOOTER\">&#013;<\/p>\n<hr align=\"left\" width=\"100%\" \/>&#013;<br \/>\n&#013;<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" border=\"0\">&#013;<\/p>\n<tbody>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"top\" align=\"left\" width=\"33%\"><a href=\"transformacoes.html\">Prev<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"middle\" width=\"34%\"><a href=\"index2006.html\">Home<\/a><\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"right\" width=\"33%\"><a href=\"transformacoes-outros.html\">Next<\/a><\/td>\n<\/tr>\n<p>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"top\" align=\"left\" width=\"33%\">Transforma\u00e7\u00f5es<\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"middle\" width=\"34%\">\u00a0<\/td>\n<p>&#013;<\/p>\n<td valign=\"top\" align=\"right\" width=\"33%\">Outros programas relacionados<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; 4.2. Transforma\u00e7\u00f5es geom\u00e9tricas &#8211; bra\u00e7o rob\u00f3tico &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 compreender como as transforma\u00e7\u00f5es geom\u00e9tricas s\u00e3o &#013; realizadas sobre os objetos em rela\u00e7\u00e3o a um determinado sistema de coordenadas. &#013; No &hellip; <a href=\"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/\" class=\"more-link\">Continuar lendo <span class=\"screen-reader-text\">Transforma\u00e7\u00f5es geom\u00e9tricas<\/span><\/a><\/p>\n","protected":false},"author":48,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-77","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD\" \/>\n<meta property=\"og:description\" content=\"&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; 4.2. Transforma\u00e7\u00f5es geom\u00e9tricas &#8211; bra\u00e7o rob\u00f3tico &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 compreender como as transforma\u00e7\u00f5es geom\u00e9tricas s\u00e3o &#013; realizadas sobre os objetos em rela\u00e7\u00e3o a um determinado sistema de coordenadas. &#013; No &hellip; Continuar lendo Transforma\u00e7\u00f5es geom\u00e9tricas\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/\" \/>\n<meta property=\"og:site_name\" content=\"Marco Antonio Garcia de Carvalho, PhD\" \/>\n<meta property=\"og:image\" content=\"http:\/\/braco.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/transformacoes-geometricas\\\/\",\"url\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/transformacoes-geometricas\\\/\",\"name\":\"Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/#website\"},\"datePublished\":\"2022-03-23T22:08:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/transformacoes-geometricas\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/transformacoes-geometricas\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/transformacoes-geometricas\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transforma\u00e7\u00f5es geom\u00e9tricas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/#website\",\"url\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/\",\"name\":\"Marco Antonio Garcia de Carvalho, PhD\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/","og_locale":"pt_BR","og_type":"article","og_title":"Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD","og_description":"&#013; &#013; &#013; &#013; &#013; Introdu\u00e7\u00e3o \u00e0 computa\u00e7\u00e3o gr\u00e1fica com &#013; OpenGL &#013; &#013; Prev &#013; &#013; Next &#013; &#013; &#013; &#013; 4.2. Transforma\u00e7\u00f5es geom\u00e9tricas &#8211; bra\u00e7o rob\u00f3tico &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 compreender como as transforma\u00e7\u00f5es geom\u00e9tricas s\u00e3o &#013; realizadas sobre os objetos em rela\u00e7\u00e3o a um determinado sistema de coordenadas. &#013; No &hellip; Continuar lendo Transforma\u00e7\u00f5es geom\u00e9tricas","og_url":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/","og_site_name":"Marco Antonio Garcia de Carvalho, PhD","og_image":[{"url":"braco.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/","url":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/","name":"Transforma\u00e7\u00f5es geom\u00e9tricas - Marco Antonio Garcia de Carvalho, PhD","isPartOf":{"@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/#website"},"datePublished":"2022-03-23T22:08:49+00:00","breadcrumb":{"@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/transformacoes-geometricas\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wordpress.ft.unicamp.br\/magic\/"},{"@type":"ListItem","position":2,"name":"Transforma\u00e7\u00f5es geom\u00e9tricas"}]},{"@type":"WebSite","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/#website","url":"https:\/\/wordpress.ft.unicamp.br\/magic\/","name":"Marco Antonio Garcia de Carvalho, PhD","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wordpress.ft.unicamp.br\/magic\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"}]}},"_links":{"self":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages\/77","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/comments?post=77"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages\/77\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/media?parent=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}