Advertisement
Guest User

Untitled

a guest
May 25th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.52 KB | None | 0 0
  1. // TeaPot3D.cpp - Isabel H. Manssour
  2. // Um programa OpenGL que exemplifica a visualização
  3. // de objetos 3D.
  4.  
  5. #ifdef __APPLE__
  6. #include <GLUT/glut.h>
  7. #else
  8. #include <GL/glut.h>
  9. #endif
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13.  
  14. GLfloat angle, fAspect, rotX, rotY;
  15. GLdouble obsX, obsY, obsZ;
  16. GLfloat r, g, b;
  17. GLint especMaterial;
  18. // Função responsável pela especificação dos parâmetros de iluminação
  19. void DefineIluminacao (void)
  20. {
  21. GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0};
  22. GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0}; // "cor"
  23. //GLfloat luzEspecular[4]={r, g, b, 1.0};
  24. GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};
  25.  
  26. // Capacidade de brilho do material
  27. GLfloat especularidade[4]={1.0,1.0,1.0,1.0};
  28. // Define a refletância do material
  29. //glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);
  30. // Define a concentração do brilho
  31. //glMateriali(GL_FRONT,GL_SHININESS,especMaterial);
  32.  
  33. // Ativa o uso da luz ambiente
  34. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);
  35.  
  36. // Define os parâmetros da luz de número 0
  37. glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);
  38. glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );
  39. //glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );
  40. glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );
  41. }
  42.  
  43. // Função callback chamada para fazer o desenho
  44. void Desenha(void)
  45. {
  46. // Limpa a janela de visualização com a cor
  47. // de fundo definida previamente
  48. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  49.  
  50. DefineIluminacao();
  51.  
  52. // Troca cor corrente para azul
  53. glColor3f(0.0f, 0.0f, 1.0f);
  54.  
  55. // Desenha o teapot com a cor corrente (wire-frame)
  56. glutSolidTeapot(50.0f);
  57.  
  58. // Execução dos comandos de desenho
  59. glutSwapBuffers();
  60. }
  61.  
  62.  
  63. // Inicialização
  64. void Inicializa(void)
  65. {
  66. // Define a cor de fundo da janela de visualização como branca
  67. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  68.  
  69. // Habilita a definição da cor do material a partir da cor corrente
  70. glEnable(GL_COLOR_MATERIAL);
  71. //Habilita o uso de iluminação
  72. glEnable(GL_LIGHTING);
  73. // Habilita a luz de número 0
  74. glEnable(GL_LIGHT0);
  75. // Habilita o depth-buffering
  76. glEnable(GL_DEPTH_TEST);
  77.  
  78. // Habilita o modelo de colorização de Gouraud
  79. glShadeModel(GL_FLAT);
  80.  
  81. // Inicializa a variável que especifica o ângulo da projeção
  82. // perspectiva
  83. angle=50;
  84.  
  85. // Inicializa as variáveis usadas para alterar a posição do
  86. // observador virtual
  87. rotX = 30;
  88. rotY = 0;
  89. obsZ = 180;
  90. r, g, b = 1.0;
  91. especMaterial = 90;
  92. }
  93.  
  94.  
  95. // Função usada para especificar a posição do observador virtual
  96. void PosicionaObservador(void)
  97. {
  98. // Especifica sistema de coordenadas do modelo
  99. glMatrixMode(GL_MODELVIEW);
  100. // Inicializa sistema de coordenadas do modelo
  101. glLoadIdentity();
  102. DefineIluminacao();
  103. // Especifica posição do observador e do alvo
  104. glTranslatef(0,0,-obsZ);
  105. glRotatef(rotX,1,0,0);
  106. glRotatef(rotY,0,1,0);
  107. }
  108.  
  109.  
  110. // Função usada para especificar o volume de visualização
  111. void EspecificaParametrosVisualizacao(void)
  112. {
  113. // Especifica sistema de coordenadas de projeção
  114. glMatrixMode(GL_PROJECTION);
  115. // Inicializa sistema de coordenadas de projeção
  116. glLoadIdentity();
  117.  
  118. // Especifica a projeção perspectiva(angulo,aspecto,zMin,zMax)
  119. gluPerspective(angle,fAspect,0.5,500);
  120.  
  121. PosicionaObservador();
  122. }
  123.  
  124.  
  125. // Função callback chamada quando o tamanho da janela é alterado
  126. void AlteraTamanhoJanela(GLsizei w, GLsizei h)
  127. {
  128. // Para previnir uma divisão por zero
  129. if ( h == 0 ) h = 1;
  130.  
  131. // Especifica as dimensões da viewport
  132. glViewport(0, 0, w, h);
  133.  
  134. // Calcula a correção de aspecto
  135. fAspect = (GLfloat)w/(GLfloat)h;
  136.  
  137. EspecificaParametrosVisualizacao();
  138. }
  139.  
  140.  
  141. // Callback para gerenciar eventos do mouse
  142. void GerenciaMouse(int button, int state, int x, int y)
  143. {
  144. if (button == GLUT_LEFT_BUTTON)
  145. if (state == GLUT_DOWN) {
  146. // Zoom-in
  147. if (angle >= 10)
  148. angle -= 5;
  149. }
  150. if (button == GLUT_RIGHT_BUTTON)
  151. if (state == GLUT_DOWN) {
  152. // Zoom-out
  153. if (angle <= 130)
  154. angle += 5;
  155. }
  156. EspecificaParametrosVisualizacao();
  157. glutPostRedisplay();
  158. }
  159.  
  160.  
  161. // Função callback chamada para gerenciar eventos de teclas especiais (F1,PgDn,...)
  162. void TeclasEspeciais (int tecla, int x, int y)
  163. {
  164. switch (tecla)
  165. {
  166. case GLUT_KEY_LEFT: rotY--;
  167. break;
  168. case GLUT_KEY_RIGHT:rotY++;
  169. break;
  170. case GLUT_KEY_UP: rotX++;
  171. break;
  172. case GLUT_KEY_DOWN: rotX--;
  173. break;
  174. case GLUT_KEY_HOME: obsZ++;
  175. break;
  176. case GLUT_KEY_END: obsZ--;
  177. break;
  178. }
  179. PosicionaObservador();
  180. glutPostRedisplay();
  181. }
  182.  
  183.  
  184. // Programa Principal
  185. int main()
  186. {
  187. int argc = 0;
  188. char *argv[] = { (char *)"gl", 0 };
  189.  
  190. glutInit(&argc,argv);
  191.  
  192. // Define do modo de operacao da GLUT
  193. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  194.  
  195. // Especifica a posição inicial da janela GLUT
  196. glutInitWindowPosition(5,5);
  197.  
  198. // Especifica o tamanho inicial em pixels da janela GLUT
  199. glutInitWindowSize(400,400);
  200.  
  201. // Cria a janela passando como argumento o titulo da mesma
  202. glutCreateWindow("Desenho de um teapot com iluminação");
  203.  
  204. // Registra a funcao callback de redesenho da janela de visualizacao
  205. glutDisplayFunc(Desenha);
  206. // Registra a funcao callback para tratamento das teclas especiais
  207. glutSpecialFunc(TeclasEspeciais);
  208. // Registra a funcao callback para tratamento do redimensionamento da janela
  209. glutReshapeFunc(AlteraTamanhoJanela);
  210. // Registra a funcao callback para tratamento do mouse
  211. glutMouseFunc(GerenciaMouse);
  212.  
  213. Inicializa();
  214. glutMainLoop();
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement