Advertisement
Guest User

Grafika példa program

a guest
Jan 22nd, 2014
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <math.h>
  2. #include <stdlib.h>
  3.  
  4. #if defined(__APPLE__)
  5.   #include <OpenGL/gl.h>
  6.   #include <OpenGL/glu.h>
  7.   #include <GLUT/glut.h>
  8. #else
  9.   #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
  10.     #include <windows.h>
  11.   #endif
  12.   #include <GL/gl.h>
  13.   #include <GL/glu.h>
  14.   #include <GL/glut.h>
  15. #endif
  16.  
  17. struct Vector {
  18.   float x, y, z;
  19.  
  20.   Vector(float v = 0) : x(v), y(v), z(v) { }
  21.   Vector(float x, float y, float z) : x(x), y(y), z(z) { }
  22.   Vector operator+(const Vector& v) const { return Vector(x + v.x, y + v.y, z + v.z); }
  23.   Vector operator-(const Vector& v) const { return Vector(x - v.x, y - v.y, z - v.z); }
  24.   Vector operator*(const Vector& v) const { return Vector(x * v.x, y * v.y, z * v.z); }
  25.   Vector operator/(const Vector& v) const { return Vector(x / v.x, y / v.y, z / v.z); }
  26.   float length() const { return sqrt(x*x + y*y + z*z); }
  27.   void glTranslatef() { ::glTranslatef(x, y, z); }
  28.   void glRotatef(float angle) { ::glRotatef(angle, x, y, z); }
  29.   void glScalef() { ::glScalef(x, y, z); }
  30. };
  31.  
  32. Vector x_axis(1, 0, 0), y_axis(0, 1, 0), z_axis(0, 0, 1);
  33. Vector pos_crate(0, 0, -5), pos_left_base(1, 0, 0), pos_right_base(-1, 0, 0), scale_base(1, 1, 3), pos_main_arm(0, 0, -2),
  34.        scale_main_arm(1, 1, 4), pos_lower_arm(0, 0, -1.5f), scale_lower_arm(0.7f, 0.7f, 3.0f), scale_wrist(1, 1, 1),
  35.        pos_left_finger(0.5f, -1.0f, 0.0f), pos_right_finger(-0.5f, -1.0f, 0.0f), scale_finger(0.2f, 1.0f, 0.2f);
  36.  
  37. float rot_base = 0, rot_main_arm = 70, rot_lower_arm = -60, rot_finger = 20, rot_finger_relative = 20;
  38.  
  39. void onDisplay() {
  40.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  41.  
  42.   glPushMatrix(); {
  43.     y_axis.glRotatef(rot_base);
  44.  
  45.     // Jobb oldali alap
  46.     glPushMatrix(); {
  47.       pos_right_base.glTranslatef();
  48.       scale_base.glScalef();
  49.       glutSolidCube(1.0f);
  50.     } glPopMatrix();
  51.    
  52.     // Bal oldali alap
  53.     glPushMatrix(); {
  54.       pos_left_base.glTranslatef();
  55.       scale_base.glScalef();
  56.       glutSolidCube(1.0f);
  57.     } glPopMatrix();
  58.  
  59.     x_axis.glRotatef(rot_main_arm);
  60.     pos_main_arm.glTranslatef();
  61.  
  62.     // Felkar
  63.     glPushMatrix(); {
  64.       scale_main_arm.glScalef();
  65.       glutSolidCube(1.0f);
  66.     } glPopMatrix();
  67.  
  68.     pos_main_arm.glTranslatef();
  69.  
  70.     x_axis.glRotatef(rot_lower_arm);
  71.     pos_lower_arm.glTranslatef();
  72.  
  73.     // Alkar
  74.     glPushMatrix(); {
  75.       scale_lower_arm.glScalef();
  76.       glutSolidCube(1.0f);
  77.     } glPopMatrix();
  78.  
  79.     pos_lower_arm.glTranslatef();
  80.  
  81.     // Csukló
  82.     glPushMatrix(); {
  83.       scale_wrist.glScalef();
  84.       glutSolidCube(1.0f);
  85.     } glPopMatrix();
  86.  
  87.     // Jobb 'ujj'
  88.     glPushMatrix(); {
  89.       z_axis.glRotatef(-rot_finger);
  90.  
  91.       glTranslatef(0, pos_right_finger.y, 0);
  92.  
  93.       glPushMatrix(); {
  94.         glTranslatef(pos_right_finger.x, 0, 0);
  95.         z_axis.glRotatef(-rot_finger_relative);
  96.         scale_finger.glScalef();
  97.         glutSolidCube(1.0f);
  98.       } glPopMatrix();
  99.  
  100.       pos_right_finger.glTranslatef();
  101.       z_axis.glRotatef(rot_finger_relative);
  102.       scale_finger.glScalef();
  103.       glutSolidCube(1.0f);
  104.     } glPopMatrix();
  105.  
  106.     // Bal 'ujj'
  107.     glPushMatrix(); {
  108.       z_axis.glRotatef(rot_finger);
  109.      
  110.       glTranslatef(0, pos_left_finger.y, 0);
  111.  
  112.       glPushMatrix(); {
  113.         glTranslatef(pos_left_finger.x, 0, 0);
  114.         z_axis.glRotatef(rot_finger_relative);
  115.         scale_finger.glScalef();
  116.         glutSolidCube(1.0f);
  117.       } glPopMatrix();
  118.  
  119.       pos_left_finger.glTranslatef();
  120.       z_axis.glRotatef(-rot_finger_relative);
  121.       scale_finger.glScalef();
  122.       glutSolidCube(1.0f);
  123.     } glPopMatrix();
  124.  
  125.   } glPopMatrix();
  126.  
  127.   // Láda
  128.   glPushMatrix(); {
  129.     pos_crate.glTranslatef();
  130.     glutSolidCube(1.0f);
  131.   } glPopMatrix();
  132.  
  133.   glutSwapBuffers();
  134. }
  135.  
  136. enum keys_enum {q, a, w, s, e, d, r, f, num_keys};
  137. bool is_pressed[num_keys];
  138. void updateCratePos(float dt);
  139.  
  140. void onIdle() {
  141.   // Itt nem szükséges a pontos diszkrét idő szimuláció
  142.   static int last_time = glutGet(GLUT_ELAPSED_TIME);
  143.   int curr_time = glutGet(GLUT_ELAPSED_TIME);
  144.   float dt = (curr_time - last_time) / 1000.0f;
  145.   last_time = curr_time;
  146.  
  147.   if(is_pressed[q] && !is_pressed[a])
  148.     rot_finger += 32 * dt;
  149.   else if(!is_pressed[q] && is_pressed[a])
  150.     rot_finger -= 32 * dt;
  151.  
  152.   if(is_pressed[w] && !is_pressed[s])
  153.     rot_lower_arm += 32 * dt;
  154.   else if(!is_pressed[w] && is_pressed[s])
  155.     rot_lower_arm -= 32 * dt;
  156.  
  157.   if(is_pressed[e] && !is_pressed[d])
  158.     rot_main_arm += 32 * dt;
  159.   else if(!is_pressed[e] && is_pressed[d])
  160.     rot_main_arm -= 32 * dt;
  161.  
  162.   if(is_pressed[f] && !is_pressed[r])
  163.     rot_base += 32 * dt;
  164.   else if(!is_pressed[f] && is_pressed[r])
  165.     rot_base -= 32 * dt;
  166.  
  167.   updateCratePos(dt);
  168.   glutPostRedisplay();
  169. }
  170.  
  171. void onKeyboard(unsigned char key, int, int) {
  172.   switch (key) {
  173.     case 'q': case 'Q':
  174.       is_pressed[q] = true;
  175.       break;
  176.     case 'a': case 'A':
  177.       is_pressed[a] = true;
  178.       break;
  179.     case 'w': case 'W':
  180.       is_pressed[w] = true;
  181.       break;
  182.     case 's': case 'S':
  183.       is_pressed[s] = true;
  184.       break;
  185.     case 'e': case 'E':
  186.       is_pressed[e] = true;
  187.       break;
  188.     case 'd': case 'D':
  189.       is_pressed[d] = true;
  190.       break;
  191.     case 'r': case 'R':
  192.       is_pressed[r] = true;
  193.       break;
  194.     case 'f': case 'F':
  195.       is_pressed[f] = true;
  196.       break;  
  197.   }
  198. }
  199.  
  200. void onKeyboardUp(unsigned char key, int, int) {
  201.   switch (key) {
  202.     case 'q': case 'Q':
  203.       is_pressed[q] = false;
  204.       break;
  205.     case 'a': case 'A':
  206.       is_pressed[a] = false;
  207.       break;
  208.     case 'w': case 'W':
  209.       is_pressed[w] = false;
  210.       break;
  211.     case 's': case 'S':
  212.       is_pressed[s] = false;
  213.       break;
  214.     case 'e': case 'E':
  215.       is_pressed[e] = false;
  216.       break;
  217.     case 'd': case 'D':
  218.       is_pressed[d] = false;
  219.       break;
  220.     case 'r': case 'R':
  221.       is_pressed[r] = false;
  222.       break;
  223.     case 'f': case 'F':
  224.       is_pressed[f] = false;
  225.       break;  
  226.   }
  227. }
  228.  
  229. void onInitialization();
  230.  
  231. void onMouse(int, int, int, int) {}
  232.  
  233. void onMouseMotion(int, int) {}
  234.  
  235. int main(int argc, char **argv) {
  236.   glutInit(&argc, argv);
  237.   glutInitWindowSize(600, 600);
  238.   glutInitWindowPosition(100, 100);
  239.   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  240.  
  241.   glutCreateWindow("Grafika pelda program");
  242.  
  243.   glMatrixMode(GL_MODELVIEW);
  244.   glLoadIdentity();
  245.   glMatrixMode(GL_PROJECTION);
  246.   glLoadIdentity();
  247.  
  248.   onInitialization();
  249.  
  250.   glutDisplayFunc(onDisplay);
  251.   glutMouseFunc(onMouse);
  252.   glutIdleFunc(onIdle);
  253.   glutKeyboardFunc(onKeyboard);
  254.   glutKeyboardUpFunc(onKeyboardUp);
  255.   glutMotionFunc(onMouseMotion);
  256.  
  257.   glutMainLoop();
  258.  
  259.   return 0;
  260. }
  261.  
  262. // Ez a rész szükséges ahhoz, hogy a kockát 3d-ben lásd,
  263. // de a példa szempontjából most lényegtelen, hogy
  264. // ténylegesen mit csinál.
  265. void onInitialization() {
  266.   glEnable(GL_DEPTH_TEST);
  267.   glMatrixMode(GL_PROJECTION);
  268.   gluPerspective(60, 1, 0.1, 20);
  269.   glMatrixMode(GL_MODELVIEW);
  270.   gluLookAt(-9, 6, -6, 9, 0, 0, 0, 1, 0);
  271.   glEnable(GL_LIGHTING);
  272.   glEnable(GL_LIGHT0);
  273.   float p[4] = {-2, 4, -1, 0};
  274.   glLightfv(GL_LIGHT0, GL_POSITION, p);
  275.   // float c[4] = {0.0f, 0.4f, 1.0f, 1.0f};
  276.   // glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c);
  277. }
  278.  
  279. Vector pos_left_finger_tip, pos_right_finger_tip, pos_grab;
  280.  
  281. float crate_speed = 0.0f;
  282.  
  283. // A példa program egy másik szépséghibája,
  284. // hogy a láda mefogásához hackelni kell egy kicsit.
  285. void updateCratePos(float dt) {
  286.   glPushMatrix(); {
  287.     glLoadIdentity();
  288.     y_axis.glRotatef(rot_base);
  289.     x_axis.glRotatef(rot_main_arm);
  290.     pos_main_arm.glTranslatef();
  291.     pos_main_arm.glTranslatef();
  292.     x_axis.glRotatef(rot_lower_arm);
  293.     pos_lower_arm.glTranslatef();
  294.     pos_lower_arm.glTranslatef();
  295.  
  296.     glPushMatrix(); {
  297.       z_axis.glRotatef(-rot_finger);
  298.       glTranslatef(0, pos_right_finger.y, 0);
  299.       pos_right_finger.glTranslatef();
  300.       z_axis.glRotatef(rot_finger_relative);
  301.       scale_finger.glScalef();
  302.       glTranslatef(0, -0.5f, 0);
  303.  
  304.       float mx[16];
  305.       glGetFloatv(GL_MODELVIEW_MATRIX, mx);
  306.       pos_right_finger_tip.x = mx[12];
  307.       pos_right_finger_tip.y = mx[13];
  308.       pos_right_finger_tip.z = mx[14];
  309.  
  310.     } glPopMatrix();
  311.  
  312.     glPushMatrix(); {
  313.       z_axis.glRotatef(rot_finger);
  314.       glTranslatef(0, pos_left_finger.y, 0);
  315.       pos_left_finger.glTranslatef();
  316.       z_axis.glRotatef(-rot_finger_relative);
  317.       scale_finger.glScalef();
  318.       glTranslatef(0, -0.5f, 0);
  319.  
  320.       float mx[16];
  321.       glGetFloatv(GL_MODELVIEW_MATRIX, mx);
  322.       pos_left_finger_tip.x = mx[12];
  323.       pos_left_finger_tip.y = mx[13];
  324.       pos_left_finger_tip.z = mx[14];
  325.     } glPopMatrix();
  326.  
  327.   } glPopMatrix();
  328.  
  329.   pos_grab = (pos_right_finger_tip + pos_left_finger_tip) / 2;
  330.  
  331.   if((pos_right_finger_tip - pos_left_finger_tip).length() < 1.2f
  332.       && (pos_grab - pos_crate).length() < 0.6f) {
  333.     pos_crate = pos_grab;
  334.   } else {
  335.     if(pos_crate.y > 0) {
  336.       crate_speed -= 0.1 * dt;
  337.       pos_crate.y += crate_speed;
  338.     } else {
  339.       crate_speed = 0;
  340.     }
  341.   }
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement