{"id":63,"date":"2022-03-23T22:08:49","date_gmt":"2022-03-23T22:08:49","guid":{"rendered":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/"},"modified":"2022-03-23T22:08:49","modified_gmt":"2022-03-23T22:08:49","slug":"modelagem-de-solidos","status":"publish","type":"page","link":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/","title":{"rendered":"Modelagem de S\u00f3lidos"},"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=\"textura-simples.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=\"modelagem-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=\"MODELAGEM-SOLIDOS\">5.2. Programa <tt class=\"FILENAME\">jato.c<\/tt><\/a><\/h1>\n<p>&#013;<\/p>\n<p>O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 introduzir o uso de texturas e o uso de teclas &#013;<br \/>\nespeciais.<\/p>\n<p>&#013;<\/p>\n<p>O mapeamento de texturas nos objetos torna a cena mais real\u00edstica, &#013;<br \/>\nprincipalmente quando texturas de objetos reais s\u00e3o utilizadas. A maioria das &#013;<br \/>\ntexturas existentes n\u00e3o podem ser geradas de forma artificial. Quando isto \u00e9 &#013;<br \/>\nposs\u00edvel, os algoritmos utilizados s\u00e3o complexos e computacionamente custosos. &#013;<br \/>\nAssim, geramente as texturas s\u00e3o lidas de arquivos de imagens digitais &#013;<br \/>\ncapturadas com dispositivos de arquisi\u00e7\u00e3o de dados.<\/p>\n<p>&#013;<\/p>\n<p>Diversos formatos podem ser usados para armazenar uma imagem digital: bmp, &#013;<br \/>\njpeg, gif, tif, tga etc. Neste curso usaremos o formato IRIS RGB, criado pela &#013;<br \/>\nSilicon Graphics. As fun\u00e7\u00f5es que permitem a leitura de arquivos RGB e seus &#013;<br \/>\nrespectivos prot\u00f3tipos est\u00e3o implementados nos arquivos <a href=\"image.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">image.c<\/tt><\/a> e <a href=\"image.h\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">image.h<\/tt><\/a>.<\/p>\n<p>&#013;<\/p>\n<p>O objeto utilizado nesta li\u00e7\u00e3o ser\u00e1 um modelo simples de uma avi\u00e3o a jato com &#013;<br \/>\nfuselagem texturizada, im\u00f3vel sobre um plano com textura montanhosa, como mostra &#013;<br \/>\na <a href=\"modelagem-jato.html#FIG-MODELAGEM-JATO-3D\">Figura &#013;<br \/>\n5-3<\/a>. As vistas laterais, superior e frontal est\u00e3o esquematizadas na <a href=\"modelagem-jato.html#FIG-MODELAGEM-JATO\">Figura &#013;<br \/>\n5-4<\/a>.<\/p>\n<p>&#013;<\/p>\n<div class=\"FIGURE\">&#013;<\/p>\n<p><b><a name=\"FIG-MODELAGEM-JATO-3D\">Figura 5-3. Avi\u00e3o a jato &#013;<br \/>\ntridimensional<\/a><\/b><\/p>\n<p>&#013;<\/p>\n<p><img decoding=\"async\" src=\"modelagem-jato-3d.jpg\" \/><\/p>\n<\/div>\n<p>&#013;<\/p>\n<div class=\"FIGURE\">&#013;<\/p>\n<p><b><a name=\"FIG-MODELAGEM-JATO\">Figura 5-4. Vistas laterais, superior e frontal &#013;<br \/>\ndo avi\u00e3o a jato<\/a><\/b><\/p>\n<p>&#013;<\/p>\n<p><img decoding=\"async\" src=\"modelagem-jato.jpg\" \/><\/p>\n<\/div>\n<p>&#013;<\/p>\n<p>Neste exemplo, o olhar do observador \u00e9 fixo aproximadamente no centro do &#013;<br \/>\navi\u00e3o, de modo que apenas a posi\u00e7\u00e3o do observador \u00e9 alterada para o usu\u00e1rio &#013;<br \/>\npoder visualizar diversas tomadas da cena.<\/p>\n<p>&#013;<\/p>\n<p>O programa usado para modelar o avi\u00e3o \u00e9 mostrado no <a href=\"modelagem-jato.html#EXAMPLE-MODELAGEM-SOLIDOS\">Exemplo &#013;<br \/>\n5-1<\/a>. As teclas <b class=\"KEYCAP\">LEFT<\/b> e <b class=\"KEYCAP\">RIGHT<\/b> servem &#013;<br \/>\npara rotacionar a posi\u00e7\u00e3o do observador em torno do eixo y contra e a favor do &#013;<br \/>\nsentido dos ponteiros do rel\u00f3gio, respectivamente. A dist\u00e2ncia entre o &#013;<br \/>\nobservador e o centro de rota\u00e7\u00e3o (raio de observa\u00e7\u00e3o) \u00e9 alterado pelas teclas <b class=\"KEYCAP\">r<\/b> e <b class=\"KEYCAP\">R<\/b>, que aumentam o diminuem o seu valor, &#013;<br \/>\nrespectivamente. As teclas <b class=\"KEYCAP\">UP<\/b> e <b class=\"KEYCAP\">DOWN<\/b>, &#013;<br \/>\ncontrolam a altitude do observador (no eixo y). A tecla <b class=\"KEYCAP\">t<\/b> &#013;<br \/>\nhabilita ou desabilita o uso de texturas. Para finalizar o programa, basta &#013;<br \/>\ndigitar <b class=\"KEYCAP\">ESC<\/b>. As teclas e suas respectivas a\u00e7\u00f5es est\u00e3o &#013;<br \/>\ndefinidas nas fun\u00e7\u00f5es <tt class=\"FUNCTION\">keyboard()<\/tt> e <tt class=\"FUNCTION\">special()<\/tt>.<\/p>\n<p>&#013;<\/p>\n<div class=\"EXAMPLE\">&#013;<\/p>\n<p><b><a name=\"EXAMPLE-MODELAGEM-SOLIDOS\">Exemplo 5-2. programa <\/a><a href=\"jato.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">jato.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;stdio.h&gt;&#013;\n#include &lt;stdlib.h&gt;&#013;\n#include &lt;math.h&gt;&#013;\n#include &lt;GL\/glut.h&gt;&#013;\n#include \"image.h\"&#013;\n&#013;\n#define PI 3.1415&#013;\n&#013;\n#define COORD_TEXTURA_PLANO 1.0&#013;\n#define COORD_TEXTURA_AVIAO 1.0&#013;\n#define COR_DO_PLANO 0.52,0.52,0.78,1.0&#013;\n#define COR_DO_AVIAO 0.3,0.52,0.18,1.0&#013;\n#define TEXTURA_DO_PLANO \"montanhas.rgb\"&#013;\n#define TEXTURA_DO_AVIAO \"camuflagem.rgb\"&#013;\n&#013;\nGLint WIDTH =800;&#013;\nGLint HEIGHT=600;&#013;\n&#013;\nGLfloat obs[3]={0.0,7.0,0.0};&#013;\nGLfloat look[3]={0.0,3.0,0.0};&#013;\nGLuint  textura_plano;&#013;\nGLuint  textura_aviao;&#013;\n&#013;\nGLshort texturas=1;&#013;\nGLfloat tetaxz=0;&#013;\nGLfloat raioxz=6;&#013;\nGLuint  jato;&#013;\n&#013;\nGLfloat ctp[4][2]={&#013;\n  {-COORD_TEXTURA_PLANO,-COORD_TEXTURA_PLANO},&#013;\n  {+COORD_TEXTURA_PLANO,-COORD_TEXTURA_PLANO},&#013;\n  {+COORD_TEXTURA_PLANO,+COORD_TEXTURA_PLANO},&#013;\n  {-COORD_TEXTURA_PLANO,+COORD_TEXTURA_PLANO}&#013;\n};&#013;\n&#013;\nGLfloat cta[4][2]={&#013;\n  {-COORD_TEXTURA_AVIAO,-COORD_TEXTURA_AVIAO},&#013;\n  {+COORD_TEXTURA_AVIAO,-COORD_TEXTURA_AVIAO},&#013;\n  {+COORD_TEXTURA_AVIAO,+COORD_TEXTURA_AVIAO},&#013;\n  {-COORD_TEXTURA_AVIAO,+COORD_TEXTURA_AVIAO}&#013;\n};&#013;\n&#013;\n&#013;\nvoid reshape(int width, int height){&#013;\n  WIDTH=width;&#013;\n  HEIGHT=height;&#013;\n  glViewport(0,0,(GLint)width,(GLint)height);&#013;\n  glMatrixMode(GL_PROJECTION);&#013;\n  glLoadIdentity();&#013;\n  gluPerspective(70.0,width\/(float)height,0.1,30.0);&#013;\n  glMatrixMode(GL_MODELVIEW);&#013;\n}&#013;\n&#013;\nvoid compoe_jato(void){&#013;\n  GLUquadricObj *quadric;&#013;\n&#013;\n  GLfloat asa[][3]={&#013;\n    {-4.0,0.0,0.0},&#013;\n    {+4.0,0.0,0.0},&#013;\n    {0.0,0.0,3.0}&#013;\n  };&#013;\n&#013;\n  GLfloat cauda[][3]={&#013;\n    {0.0,0.0,0.0},&#013;\n    {0.0,2.0,-1.0},&#013;\n    {0.0,2.0,0.0},&#013;\n    {0.0,0.0,2.0}&#013;\n  };&#013;\n  \/* inicia a composicao do jato *\/&#013;\n  jato = glGenLists(1);&#013;\n  glNewList(jato, GL_COMPILE);&#013;\n&#013;\n  \/* asas *\/&#013;\n  glBegin(GL_TRIANGLES); &#013;\n  glTexCoord2fv(cta[0]); glVertex3fv(asa[0]);&#013;\n  glTexCoord2fv(cta[1]); glVertex3fv(asa[1]);&#013;\n  glTexCoord2fv(cta[3]); glVertex3fv(asa[2]);&#013;\n  glEnd();&#013;\n  &#013;\n  \/* corpo *\/&#013;\n  quadric = gluNewQuadric();&#013;\n  gluQuadricTexture(quadric, GL_TRUE);&#013;\n  gluCylinder(quadric, 0.5, 0.5, 4, 12, 3);&#013;\n  &#013;\n  \/* nariz *\/&#013;\n  quadric = gluNewQuadric();&#013;\n  gluQuadricTexture(quadric, GL_TRUE);&#013;\n  glPushMatrix();&#013;\n  glTranslatef(0,0,4);&#013;\n  gluCylinder(quadric, 0.5, 0.0, 1.5, 12, 3);&#013;\n  glPopMatrix();&#013;\n&#013;\n  \/* cauda *\/&#013;\n  glBegin(GL_POLYGON); &#013;\n  glTexCoord2fv(cta[0]); glVertex3fv(cauda[0]);&#013;\n  glTexCoord2fv(cta[1]); glVertex3fv(cauda[1]);&#013;\n  glTexCoord2fv(cta[2]); glVertex3fv(cauda[2]);&#013;\n  glTexCoord2fv(cta[3]); glVertex3fv(cauda[3]);&#013;\n  glEnd();&#013;\n&#013;\n  \/* cabine do piloto *\/&#013;\n  glTranslatef(0,0.3,3.5);&#013;\n  glPushMatrix();&#013;\n  glScalef(0.7,0.7,2.0);&#013;\n  quadric=gluNewQuadric();&#013;\n  glColor3f(0.3,0.5,1);&#013;\n  glDisable(GL_TEXTURE_2D);&#013;\n  gluSphere(quadric,0.5,12,12);&#013;\n  glPopMatrix();&#013;\n&#013;\n  \/* termina a composicao do jato*\/&#013;\n  glEndList();&#013;\n}&#013;\n&#013;\nvoid display(void){&#013;\n  glEnable(GL_DEPTH_TEST);&#013;\n  &#013;\n  glDepthMask(GL_TRUE);&#013;\n  glClearColor(1.0,1.0,1.0,1.0);&#013;\n  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);&#013;\n  &#013;\n  glPushMatrix();&#013;\n&#013;\n  \/* calcula a posicao do observador *\/&#013;\n  obs[0]=raioxz*cos(2*PI*tetaxz\/360);&#013;\n  obs[2]=raioxz*sin(2*PI*tetaxz\/360);&#013;\n  gluLookAt(obs[0],obs[1],obs[2],look[0],look[1],look[2],0.0,1.0,0.0);&#013;\n&#013;\n  \/* habilita\/desabilita uso de texturas*\/&#013;\n  if(texturas){&#013;\n    glEnable(GL_TEXTURE_2D);  &#013;\n  }&#013;\n  else{&#013;\n    glDisable(GL_TEXTURE_2D);&#013;\n  }&#013;\n&#013;\n  glColor4f(COR_DO_PLANO);&#013;\n  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);&#013;\n  glBindTexture(GL_TEXTURE_2D,textura_plano);&#013;\n   &#013;\n  glBegin(GL_QUADS);&#013;\n  glTexCoord2fv(ctp[0]);  glVertex3f(-10,0,10);&#013;\n  glTexCoord2fv(ctp[1]);  glVertex3f(10,0,10);&#013;\n  glTexCoord2fv(ctp[2]);  glVertex3f(10,0,-10);&#013;\n  glTexCoord2fv(ctp[3]);  glVertex3f(-10,0,-10);&#013;\n  glEnd();&#013;\n  glTranslatef(0.0,2.0,-3.0);&#013;\n&#013;\n  glColor4f(COR_DO_AVIAO);&#013;\n  glBindTexture(GL_TEXTURE_2D,textura_aviao);&#013;\n  glCallList(jato);&#013;\n&#013;\n  glPopMatrix();&#013;\n  glutSwapBuffers();&#013;\n}&#013;\n&#013;\n&#013;\nvoid special(int key, int x, int y){&#013;\n  switch (key) {&#013;\n  case GLUT_KEY_UP:&#013;\n    obs[1]=obs[1]+1;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case GLUT_KEY_DOWN:&#013;\n    obs[1] =obs[1]-1;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case GLUT_KEY_LEFT:&#013;\n    tetaxz=tetaxz+2;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case GLUT_KEY_RIGHT:&#013;\n    tetaxz=tetaxz-2;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  }&#013;\n}&#013;\n&#013;\nvoid keyboard(unsigned char key, int x, int y){&#013;\n  switch (key) {&#013;\n  case 27:&#013;\n    exit(0);&#013;\n    break;&#013;\n  case 't':&#013;\n    texturas = !texturas;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 'r':&#013;\n    raioxz=raioxz+1;&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  case 'R':&#013;\n    raioxz=raioxz-1;&#013;\n    if(raioxz==0){&#013;\n      raioxz=1;&#013;\n    }&#013;\n    glutPostRedisplay();&#013;\n    break;&#013;\n  }&#013;\n}&#013;\n&#013;\nvoid carregar_texturas(void){&#013;\n  IMAGE *img;&#013;\n  GLenum gluerr;&#013;\n&#013;\n  \/* textura do plano *\/&#013;\n  glGenTextures(1, &amp;textura_plano);&#013;\n  glBindTexture(GL_TEXTURE_2D, textura_plano);&#013;\n  &#013;\n  if(!(img=ImageLoad(TEXTURA_DO_PLANO))) {&#013;\n    fprintf(stderr,\"Error reading a texture.n\");&#013;\n    exit(-1);&#013;\n  }&#013;\n&#013;\n  gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 3, &#013;\n\t\t\t   img-&gt;sizeX, img-&gt;sizeY, &#013;\n\t\t\t   GL_RGB, GL_UNSIGNED_BYTE, &#013;\n\t\t\t   (GLvoid *)(img-&gt;data));&#013;\n  if(gluerr){&#013;\n    fprintf(stderr,\"GLULib%sn\",gluErrorString(gluerr));&#013;\n    exit(-1);&#013;\n  }&#013;\n&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);&#013;\n  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);&#013;\n&#013;\n  \/* textura do aviao *\/&#013;\n  glGenTextures(1, &amp;textura_aviao);&#013;\n  glBindTexture(GL_TEXTURE_2D, textura_aviao);&#013;\n&#013;\n  &#013;\n  if(!(img=ImageLoad(TEXTURA_DO_AVIAO))) {&#013;\n    fprintf(stderr,\"Error reading a texture.n\");&#013;\n    exit(-1);&#013;\n  }&#013;\n&#013;\n  gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 3, &#013;\n\t\t\t   img-&gt;sizeX, img-&gt;sizeY, &#013;\n\t\t\t   GL_RGB, GL_UNSIGNED_BYTE, &#013;\n\t\t\t   (GLvoid *)(img-&gt;data));&#013;\n  if(gluerr){&#013;\n    fprintf(stderr,\"GLULib%sn\",gluErrorString(gluerr));&#013;\n    exit(-1);&#013;\n  }&#013;\n&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);&#013;\n  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);&#013;\n  &#013;\n}&#013;\n&#013;\nvoid init(){&#013;\n  carregar_texturas();&#013;\n  compoe_jato();&#013;\n  glShadeModel(GL_FLAT);&#013;\n  glEnable(GL_DEPTH_TEST);&#013;\n  glEnable(GL_BLEND);&#013;\n  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);&#013;\n  glEnable(GL_TEXTURE_2D);&#013;\n}&#013;\n&#013;\nint main(int argc,char **argv){&#013;\n  glutInitWindowPosition(0,0);&#013;\n  glutInitWindowSize(WIDTH,HEIGHT);&#013;\n  glutInit(&amp;argc,argv);&#013;\n  glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);&#013;\n&#013;\n  if(!glutCreateWindow(\"Avi\u00e3o a jato\")) {&#013;\n    fprintf(stderr,\"Error opening a window.n\");&#013;\n    exit(-1);&#013;\n  }&#013;\n&#013;\n  init();&#013;\n  &#013;\n  glutKeyboardFunc(keyboard);&#013;\n  glutSpecialFunc(special);&#013;\n  glutDisplayFunc(display);&#013;\n  glutReshapeFunc(reshape);&#013;\n  glutMainLoop();&#013;\n&#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=\"jato.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">jato.c<\/tt><\/a>, salve-o juntamente com os &#013;<br \/>\narquivo <a href=\"Makefile.modelagem\" target=\"_top\" rel=\"noopener\">Makefile.modelagem<\/a>, <a href=\"image.c\" target=\"_top\" rel=\"noopener\">image.c<\/a>, <a href=\"image.h\" target=\"_top\" rel=\"noopener\">image.h<\/a>, <a href=\"montanhas.rgb\" target=\"_top\" rel=\"noopener\">montanhas.rgb<\/a> e <a href=\"camuflagem.rgb\" target=\"_top\" rel=\"noopener\">camuflagem.rgb<\/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\">-f<\/span> <span class=\"OPTION\">Makefile.modelagem<\/span> <span class=\"OPTION\">jato<\/span>&#013;\n<tt class=\"PROMPT\">$<\/tt> <b class=\"COMMAND\">.\/jato<\/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=\"MODELAGEM-DESCRICAO\">5.2.2. Descri\u00e7\u00e3o do programa <tt class=\"FILENAME\">jato.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\">#define COORD_TEXTURA_PLANO 1.0&#013;\n#define COORD_TEXTURA_AVIAO 1.0&#013;\n#define COR_DO_PLANO 0.52,0.52,0.78,1.0&#013;\n#define COR_DO_AVIAO 0.3,0.52,0.18,1.0&#013;\n#define TEXTURA_DO_PLANO \"montanhas.rgb\"&#013;\n#define TEXTURA_DO_AVIAO \"camuflagem.rgb\"<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Define as cores e coordenadas das texturas do plano e do avi\u00e3o, al\u00e9m dos &#013;<br \/>\nnomes dos arquivos que cont\u00e9m as imagens das texturas.<\/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\">GLint WIDTH =320;&#013;\nGLint HEIGHT=240;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Especifica a largura (<i class=\"FOREIGNPHRASE\">WIDTH<\/i>) e a altura (<i class=\"FOREIGNPHRASE\">HEIGHT<\/i>) iniciais da janela 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\">GLfloat obs[3]={0.0,7.0,0.0};&#013;\nGLfloat look[3]={0.0,3.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>As coordenadas da posi\u00e7\u00e3o do observador \u00e9 armazenada no vetor <font color=\"red\">obs[]<\/font> e as do ponto para onde o observador olha \u00e9 armazenado no &#013;<br \/>\nvetor <font color=\"red\">look[]<\/font>. De acordo com estes vetores, o observador &#013;<br \/>\nencontra-se no ponto (x,y,z)=(0,7,0) e est\u00e1 olhando para o ponto &#013;<br \/>\n(x,y,z)=(0,3,0).<\/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\">GLuint  textura_plano;&#013;\nGLuint  textura_aviao;<\/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\">textura_plano<\/font> e <font color=\"red\">textura_aviao<\/font> armazenam os identificadores das texturas do &#013;<br \/>\nplano e do avi\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\">GLshort texturas=1;&#013;\nGLfloat tetaxz=0;&#013;\nGLfloat raioxz=6;&#013;\nGLuint  jato;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A vari\u00e1vel <font color=\"red\">texturas<\/font> \u00e9 usada para habilitar\/desabilitar &#013;<br \/>\no uso de texturas nos objetos. As vari\u00e1veis <font color=\"red\">tetaxz<\/font> e &#013;<br \/>\n<font color=\"red\">raioxz<\/font> armazenam o \u00e2ngulo de rota\u00e7\u00e3o do ponto de &#013;<br \/>\nobserva\u00e7\u00e3o e a dist\u00e2ncia entre o observador e a origem, respectivamente. A &#013;<br \/>\nvari\u00e1vel <font color=\"red\">jato<\/font> amazena o identificador para a lista de &#013;<br \/>\napresenta\u00e7\u00e3o do avi\u00e3o a jato.<\/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\">GLfloat ctp[4][2]={&#013;\n  {-COORD_TEXTURA_PLANO,-COORD_TEXTURA_PLANO},&#013;\n  {+COORD_TEXTURA_PLANO,-COORD_TEXTURA_PLANO},&#013;\n  {+COORD_TEXTURA_PLANO,+COORD_TEXTURA_PLANO},&#013;\n  {-COORD_TEXTURA_PLANO,+COORD_TEXTURA_PLANO}&#013;\n};&#013;\n&#013;\nGLfloat cta[4][2]={&#013;\n  {-COORD_TEXTURA_AVIAO,-COORD_TEXTURA_AVIAO},&#013;\n  {+COORD_TEXTURA_AVIAO,-COORD_TEXTURA_AVIAO},&#013;\n  {+COORD_TEXTURA_AVIAO,+COORD_TEXTURA_AVIAO},&#013;\n  {-COORD_TEXTURA_AVIAO,+COORD_TEXTURA_AVIAO}&#013;\n};<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Quando uma textura \u00e9 carregada, o OpenGL guarda em uma matriz e assume &#013;<br \/>\ncoordenadas (0,0), (1,0), (1,1) e (0,1) para os quatro cantos da textura. Neste &#013;<br \/>\nexemplo, \u00e9 assumido a repeti\u00e7\u00e3o das texturas, de modo a poder cobrir todo o &#013;<br \/>\nobjeto. As coordenadas especificadas neste trecho de c\u00f3digo indicam que o objeto &#013;<br \/>\nser\u00e1 carimbado com sua respectiva textura e que as coordenadas das texturas que &#013;<br \/>\nser\u00e3o usadas para criar os carimbos do plano e do avi\u00e3o ser\u00e3o <font color=\"red\">ctp[]<\/font> e <font color=\"red\">cta[]<\/font>, 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\">  GLUquadricObj *quadric;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Qu\u00e1dricas s\u00e3o superf\u00edcies definidas pela seguinte equa\u00e7\u00e3o &#013;<br \/>\na<sub>1<\/sub>x<sup>2<\/sup> + a<sub>2<\/sub>y<sup>2<\/sup> &#013;<br \/>\n+a<sub>3<\/sub>z<sup>2<\/sup> + a<sub>4<\/sub>xy + a<sub>5<\/sub>yz + &#013;<br \/>\na<sub>6<\/sub>xz + a<sub>7<\/sub>x + a<sub>8<\/sub>y +a<sub>9<\/sub>z + &#013;<br \/>\na<sub>10<\/sub>. Os tipos de qu\u00e1dricas mais conhecidos s\u00e3o os cones, os &#013;<br \/>\ncilindros, as esferas e os discos, modelados pelo ajuste adequado dos par\u00e2metros &#013;<br \/>\na<sub>i<\/sub>. Estes objetos s\u00e3o guardados em uma estrutura de dados do tipo &#013;<br \/>\n<span class=\"TYPE\">GLUquadricObj<\/span>.<\/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\">  GLfloat asa[][3]={&#013;\n    {-4.0,0.0,0.0},&#013;\n    {+4.0,0.0,0.0},&#013;\n    {0.0,0.0,3.0}&#013;\n  };&#013;\n&#013;\n  GLfloat cauda[][3]={&#013;\n    {0.0,0.0,0.0},&#013;\n    {0.0,2.0,-1.0},&#013;\n    {0.0,2.0,0.0},&#013;\n    {0.0,0.0,2.0}&#013;\n  };<\/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\">asa[][]<\/font> e <font color=\"red\">cauda[][]<\/font> armazenam as coordenadas dos pol\u00edgonos que comp\u00f5em a &#013;<br \/>\nasa e a cauda do avi\u00e3o, 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\">  jato = glGenLists(1);&#013;\n  glNewList(jato, GL_COMPILE);<\/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\">glGenLists()<\/tt> aloca um conjunto cont\u00ednuo de &#013;<br \/>\nlistas de apresenta\u00e7\u00e3o vazias e retorna o identificador utilizado para a lista &#013;<br \/>\nalocada. Neste exemplo, o conjunto cont\u00e9m apenas uma lista de apresenta\u00e7\u00e3o. Mais &#013;<br \/>\nlistas poder\u00e3o ser alocadas com subseq\u00fcentes chamadas \u00e0 mesma fun\u00e7\u00e3o. <\/p>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glNewList()<\/tt> especifica o in\u00edcio de uma lista &#013;<br \/>\nde apresenta\u00e7\u00e3o. Todos os comandos executados at\u00e9 a chamada de <tt class=\"FUNCTION\">glEndList()<\/tt> ficar\u00e3o armazenados nesta lista. A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glNewList()<\/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 glNewList<\/code>(GLUint list, GLenum &#013;<br \/>\nmode);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p><tt class=\"PARAMETER\"><i>list<\/i><\/tt> \u00e9 um n\u00famero inteiro maior que zero que &#013;<br \/>\nidentifica de forma \u00fanica a lista de apresenta\u00e7\u00e3o. O par\u00e2metro <tt class=\"PARAMETER\"><i>mode<\/i><\/tt> pode assumir os valores <tt class=\"PARAMETER\"><i>GL_COMPILE<\/i><\/tt> e <tt class=\"PARAMETER\"><i>GL_COMPILE_AND_EXECUTE<\/i><\/tt>. O primeiro apenas armazena &#013;<br \/>\nos comandos na lista; o segundo executa os comandos enquanto s\u00e3o armazenados na &#013;<br \/>\nlista.<\/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\">  quadric = gluNewQuadric();&#013;\n  gluQuadricTexture(quadric, GL_TRUE);&#013;\n  gluCylinder(quadric, 0.5, 0.5, 4, 12, 3);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Inicia, usando a fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluNewQuadric()<\/tt>, a primeira &#013;<br \/>\ndas qu\u00e1dricas do exemplo: o corpo do avi\u00e3o. Para esta qu\u00e1drica, o mapeamento de &#013;<br \/>\ntextura est\u00e1 habilitado. A fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluCylinder()<\/tt> possui 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\">void gluCylinder<\/code>(GLUquadric* quad, GLdouble &#013;<br \/>\nbase, GLdouble top, GLdouble height, GLint slices, GLint stacks);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>O par\u00e2metro <tt class=\"PARAMETER\"><i>quad<\/i><\/tt> \u00e9 o objeto de qu\u00e1drica; <tt class=\"PARAMETER\"><i>base<\/i><\/tt>, <tt class=\"PARAMETER\"><i>top<\/i><\/tt> e <tt class=\"PARAMETER\"><i>height<\/i><\/tt> especificam o raio da base, o raio do topo e &#013;<br \/>\na altura do cilindro, respectivamente; <tt class=\"PARAMETER\"><i>slices<\/i><\/tt> &#013;<br \/>\n<tt class=\"PARAMETER\"><i>stacks<\/i><\/tt> especificam o n\u00famero de subdivis\u00f5es ao &#013;<br \/>\nredor do eixo z e ao longo do mesmo.<\/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\">  obs[0]=raioxz*cos(2*PI*tetaxz\/360);&#013;\n  obs[2]=raioxz*sin(2*PI*tetaxz\/360);&#013;\n  gluLookAt(obs[0],obs[1],obs[2],look[0],look[1],look[2],0.0,1.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>Na fun\u00e7\u00e3o <tt class=\"FUNCTION\">display()<\/tt> as coordenadas x e z da posi\u00e7\u00e3o &#013;<br \/>\ndo observador s\u00e3o calculadas e a fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluLookAt()<\/tt> \u00e9 &#013;<br \/>\nchamada para mudar a posi\u00e7\u00e3o do observador. Recomenda-se a execu\u00e7\u00e3o do Tutorial do <i>Nate Robins<\/i> (ver TelEduc) relacionado&#013;<br \/>\nao uso da fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluLookAt()<\/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\">  if(texturas){&#013;\n    glEnable(GL_TEXTURE_2D);  &#013;\n  }&#013;\n  else{&#013;\n    glDisable(GL_TEXTURE_2D);&#013;\n  }<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Aqui o mapeamento de texturas \u00e9 habilitado ou desabilitado, de acordo com o &#013;<br \/>\nestado da vari\u00e1vel <font color=\"red\">texturas<\/font>. Quando o mapeamento de &#013;<br \/>\ntexturas \u00e9 desabilitado, o objeto \u00e9 desenhado utilizando as cores especificadas &#013;<br \/>\npela fun\u00e7\u00e3o <tt class=\"FUNCTION\">glColor*()<\/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\">  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);<\/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\">glTexEnvf()<\/tt> define os par\u00e2metros do ambiente &#013;<br \/>\nde textura. O primeiro par\u00e2metro \u00e9 sempre <tt class=\"PARAMETER\"><i>GL_TEXTURE_ENV<\/i><\/tt>; o segundo par\u00e2metro \u00e9 sempre <tt class=\"PARAMETER\"><i>GL_TEXTURE_ENV_MODE<\/i><\/tt> e o terceiro especifica como a &#013;<br \/>\ntextura ser\u00e1 combinada com a cor para formar a superf\u00edcie do objeto, neste caso &#013;<br \/>\nsubstituindo completamente a cor do objeto pela textura corrente.<\/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\">  glBindTexture(GL_TEXTURE_2D,textura_plano);&#013;\n   &#013;\n  glBegin(GL_QUADS);&#013;\n  glTexCoord2fv(ctp[0]);  glVertex3f(-10,0,10);&#013;\n  glTexCoord2fv(ctp[1]);  glVertex3f(10,0,10);&#013;\n  glTexCoord2fv(ctp[2]);  glVertex3f(10,0,-10);&#013;\n  glTexCoord2fv(ctp[3]);  glVertex3f(-10,0,-10);&#013;\n  glEnd();<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p><tt class=\"FUNCTION\">glBindTexture()<\/tt> carrega a textura bidimensional &#013;<br \/>\nassociada com a vari\u00e1vel <font color=\"red\">textura_plano<\/font>. Em seguida, um &#013;<br \/>\nplano \u00e9 desenhado usando <tt class=\"PARAMETER\"><i>GL_QUADS<\/i><\/tt>. Observe que, &#013;<br \/>\nantes de desenhar cada v\u00e9rtice, a fun\u00e7\u00e3o <tt class=\"FUNCTION\">glTexCoord2fv()<\/tt> &#013;<br \/>\n\u00e9 chamada para definir as coordenadas de textura correntes.<\/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 carregar_texturas(void){&#013;\n  IMAGE *img;&#013;\n  GLenum gluerr;&#013;\n&#013;\n  \/* textura do plano *\/&#013;\n  glGenTextures(1, &amp;textura_plano);&#013;\n  glBindTexture(GL_TEXTURE_2D, textura_plano);&#013;\n  &#013;\n  if(!(img=ImageLoad(TEXTURA_DO_PLANO))) {&#013;\n    fprintf(stderr,\"Error reading a texture.n\");&#013;\n    exit(-1);&#013;\n  }<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>A carga das texturas \u00e9 feita com uso da fun\u00e7\u00e3o <tt class=\"FUNCTION\">ImageLoad()<\/tt>, implementada em <a href=\"image.c\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">image.c<\/tt><\/a> e definida em <a href=\"image.h\" target=\"_top\" rel=\"noopener\"><tt class=\"FILENAME\">image.h<\/tt><\/a>. Esta fun\u00e7\u00e3o recebe como &#013;<br \/>\npar\u00e2metro o nome do arquivo com a imagem da textura e retorna um ponteiro para &#013;<br \/>\numa estrutura de dados do tipo <span class=\"TYPE\">IMAGE<\/span>.<\/p>\n<p>&#013;<\/p>\n<p>A fun\u00e7\u00e3o <tt class=\"FUNCTION\">glGenTextures()<\/tt> gera 1 nome de textura em &#013;<br \/>\n<font color=\"red\">textura_plano<\/font>. Um nome de textura \u00e9 qualquer inteiro &#013;<br \/>\ndiferente de zero que identifique de forma \u00fanica a textura. Assim, texturas &#013;<br \/>\ndiferentes possuem nomes diferentes. Caso o segundo par\u00e2metro desta fun\u00e7\u00e3o seja &#013;<br \/>\num vetor de elementos <span class=\"TYPE\">GLuint<\/span>, mais nomes de textura &#013;<br \/>\npodem ser gerados, um para cada elemento deste vetor.<\/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\">  gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 3, &#013;\n\t\t\t   img-&gt;sizeX, img-&gt;sizeY, &#013;\n\t\t\t   GL_RGB, GL_UNSIGNED_BYTE, &#013;\n\t\t\t   (GLvoid *)(img-&gt;data));<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Mipmaps s\u00e3o s\u00e9ries de vers\u00f5es em baixa resolu\u00e7\u00e3o de um mapa de textura. &#013;<br \/>\nGeralmente \u00e9 utilizado para texturizar um objeto cuja resolu\u00e7\u00e3o na tela difere &#013;<br \/>\nda resolu\u00e7\u00e3o no mapa de textura. Por exemplo, um objeto pr\u00f3ximo da tela pode ser &#013;<br \/>\ndesenhado utilizando uma resolu\u00e7\u00e3o de textura maior que um objeto distante da &#013;<br \/>\ntela. O uso de mipmaps evita o efeito de serrilhamento (<i class=\"FOREIGNPHRASE\">aliasing<\/i>) e outros dist\u00farbios de exibi\u00e7\u00e3o quando um &#013;<br \/>\nobjeto \u00e9 aproximado ou afastado da tela.<\/p>\n<p>&#013;<\/p>\n<p>Mipmaps bidimensionais s\u00e3o constru\u00eddos com a fun\u00e7\u00e3o <tt class=\"FUNCTION\">gluBuild2dMipmaps()<\/tt>, que possuiu 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 gluBuild2dMipmaps<\/code>(GLenum target, GLint &#013;<br \/>\ninternalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const &#013;<br \/>\nvoid *data);<\/code><\/p>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p><tt class=\"PARAMETER\"><i>target<\/i><\/tt> indica o tipo de mipmaps que se deseja &#013;<br \/>\nconstruir &#8211; neste caso uma textura bidimensional. <tt class=\"PARAMETER\"><i>internalFormat<\/i><\/tt> indica o tipo de armazenagem interna &#013;<br \/>\ndo arquivo de textura. Neste exemplo, as texturas s\u00e3o imagens RGB, incluindo 3 &#013;<br \/>\n(tr\u00eas) componentes de cor. Os par\u00e2metros <tt class=\"PARAMETER\"><i>width<\/i><\/tt> e &#013;<br \/>\n<tt class=\"PARAMETER\"><i>height<\/i><\/tt> especificam a largura e a altura do dado. &#013;<br \/>\nAmbas estas dimens\u00f5es devem ser pot\u00eancias de 2. <tt class=\"PARAMETER\"><i>format<\/i><\/tt> especifica o formato dos pixels do dado &#013;<br \/>\n(RGB). <tt class=\"PARAMETER\"><i>type<\/i><\/tt> especifica o tipo de dado &#013;<br \/>\nrepresentado no vetor de dados. <tt class=\"PARAMETER\"><i>data<\/i><\/tt> especifica &#013;<br \/>\no ponteiro para a posi\u00e7\u00e3o de mem\u00f3ria onde os dados de textura residem. <\/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\">  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);<\/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\">glTexParameterf()<\/tt> define uma s\u00e9rie de &#013;<br \/>\npar\u00e2metros que controlam como uma textura \u00e9 tratada e aplicada a um fragmento de &#013;<br \/>\num dado objeto. Aqui, atrav\u00e9s dos par\u00e2metros <tt class=\"PARAMETER\"><i>GL_TEXTURE_WRAP_S<\/i><\/tt> e <tt class=\"PARAMETER\"><i>GL_TEXTURE_WRAP_T<\/i><\/tt>, a fun\u00e7\u00e3o define que nas dire\u00e7\u00f5es &#013;<br \/>\ns e t (coordenadas) a textura dever\u00e1 ser\u00e1 repetida no objeto.<\/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\">  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);&#013;\n  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#013;<\/p>\n<p \/><\/div>\n<p>&#013;<\/p>\n<p>Neste trecho do c\u00f3digo, as fun\u00e7\u00f5es <tt class=\"FUNCTION\">glTexParameterf()<\/tt> &#013;<br \/>\ndefine os tipos de filtro usados quando a textura for minimizada ou maximizada. &#013;<br \/>\nPelo par\u00e2metro <tt class=\"PARAMETER\"><i>GL_LINEAR_MIPMAP_LINEAR<\/i><\/tt>, o OpenGL &#013;<br \/>\nescolhe dois mipmaps que mais aproximam o tamanho do pixel a ser texturizado &#013;<br \/>\ncalcula a m\u00e9dia dos quatro elementos de textura mais pr\u00f3ximos do centro do &#013;<br \/>\npixel. O valor da textura para o pixel ser\u00e1 a m\u00e9dia desses dois valores. O &#013;<br \/>\npar\u00e2metro <tt class=\"PARAMETER\"><i>GL_LINEAR<\/i><\/tt>, por sua vez n\u00e3o utiliza &#013;<br \/>\nmipmaps: associa ao pixel a ser texturizado a m\u00e9dia dos quatro elementos de &#013;<br \/>\ntextura mais pr\u00f3ximos do centro do pixel.<\/p>\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=\"textura-simples.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=\"modelagem-outros.html\">Next<\/a><\/td>\n<\/tr>\n<p>&#013;<\/p>\n<tr>&#013;<\/p>\n<td valign=\"top\" align=\"left\" width=\"33%\">Texturas simples<\/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; 5.2. Programa jato.c &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 introduzir o uso de texturas e o uso de teclas &#013; especiais. &#013; O mapeamento de texturas nos objetos torna a cena mais real\u00edstica, &hellip; <a href=\"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/\" class=\"more-link\">Continuar lendo <span class=\"screen-reader-text\">Modelagem de S\u00f3lidos<\/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-63","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Modelagem de S\u00f3lidos - 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\/modelagem-de-solidos\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modelagem de S\u00f3lidos - 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; 5.2. Programa jato.c &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 introduzir o uso de texturas e o uso de teclas &#013; especiais. &#013; O mapeamento de texturas nos objetos torna a cena mais real\u00edstica, &hellip; Continuar lendo Modelagem de S\u00f3lidos\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/\" \/>\n<meta property=\"og:site_name\" content=\"Marco Antonio Garcia de Carvalho, PhD\" \/>\n<meta property=\"og:image\" content=\"http:\/\/modelagem-jato-3d.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=\"14 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\\\/modelagem-de-solidos\\\/\",\"url\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/modelagem-de-solidos\\\/\",\"name\":\"Modelagem de S\u00f3lidos - 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\\\/modelagem-de-solidos\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/modelagem-de-solidos\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/modelagem-de-solidos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wordpress.ft.unicamp.br\\\/magic\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modelagem de S\u00f3lidos\"}]},{\"@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":"Modelagem de S\u00f3lidos - 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\/modelagem-de-solidos\/","og_locale":"pt_BR","og_type":"article","og_title":"Modelagem de S\u00f3lidos - 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; 5.2. Programa jato.c &#013; O prop\u00f3sito desta li\u00e7\u00e3o \u00e9 introduzir o uso de texturas e o uso de teclas &#013; especiais. &#013; O mapeamento de texturas nos objetos torna a cena mais real\u00edstica, &hellip; Continuar lendo Modelagem de S\u00f3lidos","og_url":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/","og_site_name":"Marco Antonio Garcia de Carvalho, PhD","og_image":[{"url":"modelagem-jato-3d.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/","url":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/","name":"Modelagem de S\u00f3lidos - 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\/modelagem-de-solidos\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wordpress.ft.unicamp.br\/magic\/modelagem-de-solidos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wordpress.ft.unicamp.br\/magic\/"},{"@type":"ListItem","position":2,"name":"Modelagem de S\u00f3lidos"}]},{"@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\/63","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=63"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/pages\/63\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.ft.unicamp.br\/magic\/wp-json\/wp\/v2\/media?parent=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}