akevintg

OpenGL (glLight, gluPerspective, etc)

May 23rd, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.59 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  OpenGL-06
  4. //
  5. //  Created by Alexander Kevin on 5/24/16.
  6. //  Copyright © 2016 Alexander Kevin. All right reserved.
  7. //
  8.  
  9. //CASE LINK : https://www.dropbox.com/s/hbisb17di5p9yfq/T00740020220154042Tugas%20dan%20Latihan%205.doc?dl=0
  10. //.exe LINK : https://www.dropbox.com/s/umewwn109ba4tuq/OpenGL-06?dl=0
  11.  
  12. #ifdef WIN32
  13. #include <windows.h>
  14. #endif
  15.  
  16. #include <stdlib.h>
  17. #include <iostream>
  18. #include <fstream>
  19.  
  20. #ifdef __APPLE__
  21. #include <GLUT/glut.h>
  22. #include <OpenGL/gl.h>
  23. #include <OpenGL/glu.h>
  24. #else
  25. #include <GL/glut.h>
  26. #include <GL/glu.h>
  27. #include <GL/gl.h>
  28. #endif
  29.  
  30. GLfloat light_diffuse[] = {1.0, 0.0, 1.0, 1.0}; /* warna merah 1. */
  31. GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
  32.  
  33. GLfloat light_diffuse2[] = {1.0, 1.0, 1.0, 1.0}; /* warna merah 2. */
  34. GLfloat light_position2[] = {1.0, 0, 1.0, 0.0};
  35.  
  36. GLfloat light_diffuse3[] = {1.0, 1, 0.5, 1.0}; /* warna merah 3. */
  37. GLfloat light_position3[] = {1.0, 1.0, 0, 0.0};
  38.  
  39. GLfloat light_diffuse4[] = {1.0, 1, 0, 1.0}; /* warna merah 4. */
  40. GLfloat light_position4[] = {0, 1.0, 1.0, 0.0};
  41. GLfloat n[6][3] = { /* secara normal kubus ada 6 muka. */
  42.     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
  43. GLint faces[6][4] = { {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4}, {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
  44. GLfloat v[8][3];
  45.  
  46. GLfloat v6kiri[8][3];
  47. GLfloat v6bawah[8][3];
  48. GLfloat v6kanan[8][3];
  49. GLfloat v6atas[8][3];
  50.  
  51. GLfloat v9kanan[8][3];
  52. GLfloat v9atas[8][3];
  53. GLfloat v9kiri[8][3];
  54. GLfloat v9bawah[8][3];
  55. int flag;
  56. void changeColor(int);
  57. void drawOne(void)
  58. {
  59.  
  60.     int i;
  61.     for (i = 0; i < 6; i++)
  62.     {
  63.         glBegin(GL_QUADS);
  64.         glNormal3fv(&n[i][0]);
  65.         glVertex3fv(&v[faces[i][0]][0]);
  66.         glVertex3fv(&v[faces[i][1]][0]);
  67.         glVertex3fv(&v[faces[i][2]][0]);
  68.         glVertex3fv(&v[faces[i][3]][0]);
  69. //        printf("%d %d %d %d\n",faces[i][0],faces[i][1],faces[i][2],faces[i][3]);
  70. //        printf("%.2f %.2f %.2f\n",n[i][0],n[i][1],n[i][2]);
  71. //        printf("%.2f %.2f %.2f\n",v[faces[i][0]][0],v[faces[i][0]][1],v[faces[i][0]][2]);
  72. //        printf("%.2f %.2f %.2f\n",v[faces[i][1]][0],v[faces[i][1]][1],v[faces[i][1]][2]);
  73. //        printf("%.2f %.2f %.2f\n",v[faces[i][2]][0],v[faces[i][2]][1],v[faces[i][2]][2]);
  74. //        printf("%.2f %.2f %.2f\n\n\n",v[faces[i][3]][0],v[faces[i][3]][1],v[faces[i][3]][2]);
  75.         glEnd();
  76.     }
  77. }
  78.  
  79. void drawSix(void)
  80. {
  81.    
  82.     int i;
  83.     for (i = 0; i < 6; i++)
  84.     {
  85.         glBegin(GL_QUADS);
  86.         glNormal3fv(&n[i][0]);
  87.         glVertex3fv(&v6kiri[faces[i][0]][0]);
  88.         glVertex3fv(&v6kiri[faces[i][1]][0]);
  89.         glVertex3fv(&v6kiri[faces[i][2]][0]);
  90.         glVertex3fv(&v6kiri[faces[i][3]][0]);
  91.         glEnd();
  92.     }
  93.     for (i = 0; i < 6; i++)
  94.     {
  95.         glBegin(GL_QUADS);
  96.         glNormal3fv(&n[i][0]);
  97.         glVertex3fv(&v6bawah[faces[i][0]][0]);
  98.         glVertex3fv(&v6bawah[faces[i][1]][0]);
  99.         glVertex3fv(&v6bawah[faces[i][2]][0]);
  100.         glVertex3fv(&v6bawah[faces[i][3]][0]);
  101.         glEnd();
  102.     }
  103.     for (i = 0; i < 6; i++)
  104.     {
  105.         glBegin(GL_QUADS);
  106.         glNormal3fv(&n[i][0]);
  107.         glVertex3fv(&v6kanan[faces[i][0]][0]);
  108.         glVertex3fv(&v6kanan[faces[i][1]][0]);
  109.         glVertex3fv(&v6kanan[faces[i][2]][0]);
  110.         glVertex3fv(&v6kanan[faces[i][3]][0]);
  111.         glEnd();
  112.     }
  113.    
  114.     for (i = 0; i < 6; i++)
  115.     {
  116.         glBegin(GL_QUADS);
  117.         glNormal3fv(&n[i][0]);
  118.         glVertex3fv(&v6atas[faces[i][0]][0]);
  119.         glVertex3fv(&v6atas[faces[i][1]][0]);
  120.         glVertex3fv(&v6atas[faces[i][2]][0]);
  121.         glVertex3fv(&v6atas[faces[i][3]][0]);
  122.         glEnd();
  123.     }
  124. }
  125.  
  126. void drawNine(void)
  127. {
  128.     int i;
  129.     for (i = 0; i < 6; i++)
  130.     {
  131.         glBegin(GL_QUADS);
  132.         glNormal3fv(&n[i][0]);
  133.         glVertex3fv(&v9kanan[faces[i][0]][0]);
  134.         glVertex3fv(&v9kanan[faces[i][1]][0]);
  135.         glVertex3fv(&v9kanan[faces[i][2]][0]);
  136.         glVertex3fv(&v9kanan[faces[i][3]][0]);
  137.         glEnd();
  138.     }
  139.    
  140.     for (i = 0; i < 6; i++)
  141.     {
  142.         glBegin(GL_QUADS);
  143.         glNormal3fv(&n[i][0]);
  144.         glVertex3fv(&v9atas[faces[i][0]][0]);
  145.         glVertex3fv(&v9atas[faces[i][1]][0]);
  146.         glVertex3fv(&v9atas[faces[i][2]][0]);
  147.         glVertex3fv(&v9atas[faces[i][3]][0]);
  148.         glEnd();
  149.     }
  150.    
  151.     for (i = 0; i < 6; i++)
  152.     {
  153.         glBegin(GL_QUADS);
  154.         glNormal3fv(&n[i][0]);
  155.         glVertex3fv(&v9kiri[faces[i][0]][0]);
  156.         glVertex3fv(&v9kiri[faces[i][1]][0]);
  157.         glVertex3fv(&v9kiri[faces[i][2]][0]);
  158.         glVertex3fv(&v9kiri[faces[i][3]][0]);
  159.         glEnd();
  160.     }
  161.     for (i = 0; i < 6; i++)
  162.     {
  163.         glBegin(GL_QUADS);
  164.         glNormal3fv(&n[i][0]);
  165.         glVertex3fv(&v9bawah[faces[i][0]][0]);
  166.         glVertex3fv(&v9bawah[faces[i][1]][0]);
  167.         glVertex3fv(&v9bawah[faces[i][2]][0]);
  168.         glVertex3fv(&v9bawah[faces[i][3]][0]);
  169.         glEnd();
  170.     }
  171. }
  172.  
  173. void soalsatu(){
  174.     drawOne();
  175.     drawSix();
  176.     drawNine();
  177. }
  178.  
  179. void display(void)
  180. {
  181.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  182.     soalsatu();
  183.     glutSwapBuffers();
  184. }
  185.  
  186. void init(void)
  187. {
  188.     /* pengaturan data vertek 1. */
  189.     v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1.5;//batas kiri
  190.     v[4][0] = v[5][0] = v[6][0] = v[7][0] = -1;//batas kanan
  191.     v[0][1] = v[1][1] = v[4][1] = v[5][1] = -0.5;//kedalam belakang
  192.     v[2][1] = v[3][1] = v[6][1] = v[7][1] = 0.5;//kedalaman depan
  193.     v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;//batas atas
  194.     v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;//batas bawah/
  195.    
  196.     /* pengaturan data vertek 6. */
  197.     v6kiri[0][0] = v6kiri[1][0] = v6kiri[2][0] = v6kiri[3][0] = -0.5;//batas kiri
  198.     v6kiri[4][0] = v6kiri[5][0] = v6kiri[6][0] = v6kiri[7][0] = 0;//batas kanan
  199.     v6kiri[0][1] = v6kiri[1][1] = v6kiri[4][1] = v6kiri[5][1] = -0.5;//kedalam belakang
  200.     v6kiri[2][1] = v6kiri[3][1] = v6kiri[6][1] = v6kiri[7][1] = 0.5;//kedalaman depan
  201.     v6kiri[0][2] = v6kiri[3][2] = v6kiri[4][2] = v6kiri[7][2] = 1;//batas atas
  202.     v6kiri[1][2] = v6kiri[2][2] = v6kiri[5][2] = v6kiri[6][2] = -1;//batas bawah/
  203.    
  204.     v6bawah[0][0] = v6bawah[1][0] = v6bawah[2][0] = v6bawah[3][0] = 0;//batas kiri
  205.     v6bawah[4][0] = v6bawah[5][0] = v6bawah[6][0] = v6bawah[7][0] = 0.5;//batas kanan
  206.     v6bawah[0][1] = v6bawah[1][1] = v6bawah[4][1] = v6bawah[5][1] = -0.5;//kedalam belakang
  207.     v6bawah[2][1] = v6bawah[3][1] = v6bawah[6][1] = v6bawah[7][1] = 0.5;//kedalaman depan
  208.     v6bawah[0][2] = v6bawah[3][2] = v6bawah[4][2] = v6bawah[7][2] = 1;//batas atas
  209.     v6bawah[1][2] = v6bawah[2][2] = v6bawah[5][2] = v6bawah[6][2] = 0.75;//batas bawah
  210.    
  211.     v6kanan[0][0] = v6kanan[1][0] = v6kanan[2][0] = v6kanan[3][0] = 0.25;//batas kiri
  212.     v6kanan[4][0] = v6kanan[5][0] = v6kanan[6][0] = v6kanan[7][0] = 0.5;//batas kanan
  213.     v6kanan[0][1] = v6kanan[1][1] = v6kanan[4][1] = v6kanan[5][1] = -0.5;//kedalam belakang
  214.     v6kanan[2][1] = v6kanan[3][1] = v6kanan[6][1] = v6kanan[7][1] = 0.5;//kedalaman depan
  215.     v6kanan[0][2] = v6kanan[3][2] = v6kanan[4][2] = v6kanan[7][2] = 0.25;//batas atas
  216.     v6kanan[1][2] = v6kanan[2][2] = v6kanan[5][2] = v6kanan[6][2] = 0.75;//batas bawah
  217.    
  218.     v6atas[0][0] = v6atas[1][0] = v6atas[2][0] = v6atas[3][0] = 0;//batas kiri
  219.     v6atas[4][0] = v6atas[5][0] = v6atas[6][0] = v6atas[7][0] = 0.5;//batas kanan
  220.     v6atas[0][1] = v6atas[1][1] = v6atas[4][1] = v6atas[5][1] = -0.5;//kedalam belakang
  221.     v6atas[2][1] = v6atas[3][1] = v6atas[6][1] = v6atas[7][1] = 0.5;//kedalaman depan
  222.     v6atas[0][2] = v6atas[3][2] = v6atas[4][2] = v6atas[7][2] = 0.25;//batas atas
  223.     v6atas[1][2] = v6atas[2][2] = v6atas[5][2] = v6atas[6][2] = 0;//batas bawah
  224.    
  225.     /* pengaturan data vertek 9. */
  226.     v9kanan[0][0] = v9kanan[1][0] = v9kanan[2][0] = v9kanan[3][0] = 1.25;//batas kiri
  227.     v9kanan[4][0] = v9kanan[5][0] = v9kanan[6][0] = v9kanan[7][0] = 1.75;//batas kanan
  228.     v9kanan[0][1] = v9kanan[1][1] = v9kanan[4][1] = v9kanan[5][1] = -0.5;//kedalam belakang
  229.     v9kanan[2][1] = v9kanan[3][1] = v9kanan[6][1] = v9kanan[7][1] = 0.5;//kedalaman depan
  230.     v9kanan[0][2] = v9kanan[3][2] = v9kanan[4][2] = v9kanan[7][2] = 1;//batas atas
  231.     v9kanan[1][2] = v9kanan[2][2] = v9kanan[5][2] = v9kanan[6][2] = -1;//batas bawah/
  232.    
  233.     v9atas[0][0] = v9atas[1][0] = v9atas[2][0] = v9atas[3][0] = 0.75;//batas kiri
  234.     v9atas[4][0] = v9atas[5][0] = v9atas[6][0] = v9atas[7][0] = 1.25;//batas kanan
  235.     v9atas[0][1] = v9atas[1][1] = v9atas[4][1] = v9atas[5][1] = -0.5;//kedalam belakang
  236.     v9atas[2][1] = v9atas[3][1] = v9atas[6][1] = v9atas[7][1] = 0.5;//kedalaman depan
  237.     v9atas[0][2] = v9atas[3][2] = v9atas[4][2] = v9atas[7][2] = -1;//batas atas
  238.     v9atas[1][2] = v9atas[2][2] = v9atas[5][2] = v9atas[6][2] = -0.75;//batas bawah
  239.    
  240.     v9kiri[0][0] = v9kiri[1][0] = v9kiri[2][0] = v9kiri[3][0] = 0.75;//batas kiri
  241.     v9kiri[4][0] = v9kiri[5][0] = v9kiri[6][0] = v9kiri[7][0] = 1;//batas kanan
  242.     v9kiri[0][1] = v9kiri[1][1] = v9kiri[4][1] = v9kiri[5][1] = -0.5;//kedalam belakang
  243.     v9kiri[2][1] = v9kiri[3][1] = v9kiri[6][1] = v9kiri[7][1] = 0.5;//kedalaman depan
  244.     v9kiri[0][2] = v9kiri[3][2] = v9kiri[4][2] = v9kiri[7][2] = -0.75;//batas atas
  245.     v9kiri[1][2] = v9kiri[2][2] = v9kiri[5][2] = v9kiri[6][2] = -0.25;//batas bawah
  246.    
  247.     v9bawah[0][0] = v9bawah[1][0] = v9bawah[2][0] = v9bawah[3][0] = 0.75;//batas kiri
  248.     v9bawah[4][0] = v9bawah[5][0] = v9bawah[6][0] = v9bawah[7][0] = 1.25;//batas kanan
  249.     v9bawah[0][1] = v9bawah[1][1] = v9bawah[4][1] = v9bawah[5][1] = -0.5;//kedalam belakang
  250.     v9bawah[2][1] = v9bawah[3][1] = v9bawah[6][1] = v9bawah[7][1] = 0.5;//kedalaman depan
  251.     v9bawah[0][2] = v9bawah[3][2] = v9bawah[4][2] = v9bawah[7][2] = -0.25;//batas atas
  252.     v9bawah[1][2] = v9bawah[2][2] = v9bawah[5][2] = v9bawah[6][2] = 0;//batas bawah
  253.    
  254.     /* meng-Enable-kan pencahayaan OpenGL single. */
  255.     changeColor(1);
  256.     /* mengatur penglihatan kubus. */
  257.     glMatrixMode(GL_PROJECTION);
  258.     /* sudut pandangan, aspek ratio, kedekatan Z, jauh Z */
  259.     gluPerspective(40.0,1.0, 1.0, 10.0);
  260.     glMatrixMode(GL_MODELVIEW);
  261.     gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.);
  262.    
  263.     /* mengatur posisi kubus */
  264.     glTranslatef(0.0, 0.0, -1.0);
  265.     glRotatef(60, 1.0, 0.0, 0.0);
  266.     glRotatef(-20, 0.0, 0.0, 1.0);
  267. }
  268.  
  269.  
  270. void changeColor(int flag){
  271.     if(flag==1){
  272.         glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  273.         glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  274.     }
  275.     else if(flag==2){
  276.         glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse2);
  277.         glLightfv(GL_LIGHT0, GL_POSITION, light_position2);
  278.     }
  279.     else if(flag==3){
  280.         glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse3);
  281.         glLightfv(GL_LIGHT0, GL_POSITION, light_position3);
  282.     }
  283.     else if(flag==4){
  284.         glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse4);
  285.         glLightfv(GL_LIGHT0, GL_POSITION, light_position4);
  286.     }
  287.     glEnable(GL_LIGHT0);
  288.     glEnable(GL_LIGHTING);
  289.     glEnable(GL_DEPTH_TEST);
  290. }
  291.  
  292. void kunci(unsigned char key, int x, int y)
  293. {
  294.     static int rot=0;
  295.     flag=1;
  296.     switch (key)
  297.     {
  298.             /* aplikasi berhenti ketika tombol q ditekan */
  299.         case 27 :
  300.         case 'z':
  301.             exit(0);
  302.             break;
  303.         case 'q':
  304.             glRotated(5, 0,0,1);
  305.             break;
  306.         case 'e':
  307.             glRotated(-5, 0,0,1);
  308.             break;
  309.         case 's':
  310.             glRotated(5, 1,0,0);
  311.             break;
  312.         case 'a':
  313.             glRotated(-5, 0,1,0);
  314.             break;
  315.         case 'w':
  316.             glRotated(-5, 1,0,0);
  317.             break;
  318.         case 'd':
  319.             glRotated(5, 0,1,0);
  320.             break;
  321.         case '1':
  322.             changeColor(1);
  323.             break;
  324.         case '2':
  325.             changeColor(2);
  326.             break;
  327.         case '3':
  328.             changeColor(3);
  329.             break;
  330.         case '4':
  331.             changeColor(4);
  332.             break;
  333.     }
  334.     glutPostRedisplay();
  335. }
  336.  
  337.  
  338.  
  339. int main(int argc, char **argv)
  340. {
  341.     printf("Welcome,\n");
  342.     printf("Press Keyboard\n");
  343.     printf("(1) for color and perspective 1\n");
  344.     printf("(2) for color and perspective 2\n");
  345.     printf("(3) for color and perspective 3\n");
  346.     printf("(4) for color and perspective 4\n");
  347.     printf("for x-y-rotation use standart WASD (up,left,down,right)\n");
  348.     printf("and q for left rotate and e for right z-rotation\n");
  349.     printf("<press z to exit>\n");
  350.  
  351.     glutInit(&argc, argv);
  352.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  353.     glutCreateWindow("NIM");
  354.     glutDisplayFunc(display);
  355.     init();
  356.     glutKeyboardFunc(kunci);
  357.     glutMainLoop();
  358.     return 0;
  359. }
Advertisement
Add Comment
Please, Sign In to add comment