Advertisement
Guest User

Untitled

a guest
Oct 20th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. /*
  2. 1. Vašou úlohou je vytvoriť scénu, ktorá bude ohraničená kockou, v ktorej sa bude odrážať guľa.
  3. 2. V rámci scény definujte kameru na kocke, ktorá sa vždy smeruje na stred kocky.
  4.     - Dorobte pohyb kamery po kocke pomocou klávesnice.
  5.     - Treba odlíšiť jednotlivé strany kocky, aby sme vedeli odsledovať korektnosť pohybu (napr. v rámci bodu 5).
  6. 3. Dorobte možnosť prepnúť kameru na guľu tj. guľa = avatar.
  7.     - Pozor na ta aby ste kameru neumiestnili do vnútra gule - chceme vidieť stále scénu tj. steny kocky aj guľu.
  8.     - Pozn.: Kamera je nasmerovaná smerom pohybu gule a je umiestnená fixnou odchýlkou za (nad)
  9.       guľou. (čiže ako by sme naháňali guľu :) resp. kamera v NFS, keď sa prepne za auto ...)
  10. 4. Dorobte otáčanie kamery v scéne pomocou myši v prípade, že je kamera nastavená na režim sledovanie pohybu gule.
  11.     - Súradnice myši v strede obrazovky (x,y=0) znamená, že smer pohľadu je totožná smeru guličky.
  12.     - Súradnice myši napr. v pravom krajnom rohu (x=1) znamená, že sa otočíme doprava o 180 stupňov (pozeráme sa dozadu).
  13.     - Atď...
  14. 5. Na stenách kocky vykreslite fraktály, ktoré si vygenerujete sami experimentovaním s funkciami.
  15.    (To neznamená, že len zmeníte hodnoty v maticiach v programe ktorý ste dostali. Experimentujte
  16.    s pravdepodobnosťami, počtom funkcií, zapojte do toho farbu...).*/
  17.  
  18. #include <iostream>
  19. #include <math.h>
  20. #include <ctime>
  21. #include <sstream>
  22. #include <string>
  23. #include "glm/glm/glm.hpp"
  24. #include "glut.h"
  25.  
  26. using namespace std;
  27. using namespace glm;
  28.  
  29. const vec3 nullvec = vec3(0, 0, 0);
  30. float xx, yy = 0, zz = -2;
  31. float x, y, z = 0;
  32. float angle = 0;
  33. int camera_mode = 0;
  34. GLfloat angle1 = 180, angle2 = 180;
  35.  
  36.  
  37. class Ball
  38. {
  39. public:
  40.     Ball(vec3 center = nullvec)
  41.     {
  42.         pos = center;
  43.     }
  44.  
  45.     void draw()
  46.     {
  47.         glTranslatef(pos.x, pos.y, pos.z);
  48.         glutSolidSphere(size, 20, 20);
  49.         glTranslatef(-pos.x, -pos.y, -pos.z);
  50.  
  51.         drawDir();
  52.     }
  53.  
  54.     void drawDir()
  55.     {
  56.         float offs = 10;
  57.         //glColor3f(0, 0, 1);
  58.         /*glBegin(GL_LINES);
  59.         glVertex3f(pos.x - offs*vel.x, pos.y - offs*vel.y, pos.z - offs*vel.z);
  60.         glVertex3f(pos.x, pos.y, pos.z);
  61.         glEnd();*/
  62.  
  63.         //glColor3f(1, 0, 0);
  64.         glBegin(GL_LINES);
  65.         glVertex3f(pos.x, pos.y, pos.z);
  66.         glVertex3f(pos.x + offs*vel.x, pos.y + offs*vel.y, pos.z + offs*vel.z);
  67.         glEnd();
  68.     }
  69.  
  70.     void setPos(vec3 pos)
  71.     {
  72.         this->pos = pos;
  73.     }
  74.     vec3 getPos(void)
  75.     {
  76.         return this->pos;
  77.     }
  78.  
  79.     void setVel(vec3 vel)
  80.     {
  81.         this->vel = vel;
  82.     }
  83.  
  84.     vec3 getVel(void)
  85.     {
  86.         return this->vel;
  87.     }
  88.  
  89.     void setSize(float size)
  90.     {
  91.         this->size = size;
  92.     }
  93.  
  94.     float getSize(void)
  95.     {
  96.         return this->size;
  97.     }
  98.  
  99.     void setOuterBox(float ob)
  100.     {
  101.         this->outerBox = ob;
  102.     }
  103.  
  104.     void setSpeed(float speed)
  105.     {
  106.         this->speed = speed;
  107.     }
  108.  
  109.     //pohyb gulicky s nastavitelnou rychlostou a osetrenymi narazmi do stien
  110.     //ak prekroci stred gulicky + jej polomer ohranicenie stien kocky,
  111.     //dana suradnica v smerovom vektore sa vynasobi -1 a smer sa zrkadlovo zmeni
  112.     void move(void)
  113.     {
  114.         if ((pos.x + size) >= outerBox || (pos.x - size) <= -outerBox)
  115.         {
  116.             vel.x = -vel.x;
  117.         }
  118.         pos.x += vel.x * speed;
  119.  
  120.         if ((pos.y + size) >= outerBox || (pos.y - size) <= -outerBox)
  121.         {
  122.             vel.y = -vel.y;
  123.         }
  124.         pos.y += vel.y * speed;
  125.  
  126.         if ((pos.z + size) >= outerBox || (pos.z - size) <= -outerBox)
  127.         {
  128.             vel.z = -vel.z;
  129.         }
  130.         pos.z += vel.z * speed;
  131.     }
  132.  
  133.     vec3 pos, vel, col;
  134.     float size;
  135.     float outerBox;
  136.     float speed;
  137. };
  138.  
  139. class Scene
  140. {
  141. public:
  142.  
  143.     bool orto;
  144.     bool depthtest;
  145.     bool clear;
  146.  
  147.     Ball *b;
  148.  
  149.     Scene()
  150.     {
  151.         b = new Ball();
  152.  
  153.         //nahodne generovanie pociatocnych suradnic smeru pohybu gulicky
  154.         srand(static_cast <unsigned> (time(0)));
  155.         float rx = static_cast <float> (rand()) / static_cast <float> (RAND_MAX / 0.05);
  156.         float ry = static_cast <float> (rand()) / static_cast <float> (RAND_MAX / 0.05);
  157.         float rz = static_cast <float> (rand()) / static_cast <float> (RAND_MAX / 0.05);
  158.  
  159.         //nastavenie parametrov v gulicke(polomer, pociatocny smer, "rychlost", velkost kocky)
  160.         b->setSize(0.1);
  161.         b->setVel(vec3(rx, ry, rz));
  162.         b->setOuterBox(1);
  163.         b->setSpeed(0.05);
  164.     }
  165.  
  166.     //vykreslenie kocky, gulicky a jej pohybu
  167.     void draw(void)
  168.     {
  169.         angle = angle + 0.01;
  170.         glClearColor(0.0, 0.0, 0.0, 0.0);
  171.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  172.  
  173.         glPushMatrix();
  174.         //glRotatef(angle, 0, 1, 0);
  175.         center_cube(vec3(0, 0, 0), 1);
  176.         glPopMatrix();
  177.  
  178.         b->draw();
  179.         b->move();
  180.  
  181.         glutSwapBuffers();
  182.     }
  183.  
  184.     //nastavenie sceny
  185.     void setting_projection()
  186.     {
  187.         glMatrixMode(GL_PROJECTION); //len gluPerspective, glFrustum, glOrtho, glOrtho2
  188.         glLoadIdentity();
  189.         glFrustum(-1, 1, -1, 1, 1, 100);
  190.         //4. musim prepnut
  191.         glMatrixMode(GL_MODELVIEW); //camera
  192.         //5. Nastavenie kamery
  193.         glLoadIdentity();
  194.         gluLookAt(xx, yy, zz, 0, 0, 0, 0, 1, 0); //zmena pohladu na kocku
  195.     }
  196.  
  197.     void set_camera_ball(){
  198.  
  199.         float nasobok = 20; //glm::sqrt((b->size + 0.2)*(b->size + 0.2) / (b->vel.x*0.1 *b->vel.x*0.1 + b->vel.y*0.1 *b->vel.y*0.1 + b->vel.z*0.1 *b->vel.z*0.1));
  200.         gluLookAt((b->vel.x + b->pos.x), (b->vel.y + b->pos.y), (b->vel.z + b->pos.z), b->pos.x, b->pos.y, b->pos.z, 0, 1, 0);
  201.         glTranslatef(b->pos.x, b->pos.y, b->pos.z);
  202.  
  203.         //glFrustum(-1, 1, -1, 1, 1, 100);
  204.         glRotatef(angle1, 0, 1, 0);
  205.         glRotatef(angle2, 1, 0, 0);
  206.     }
  207.  
  208. private:
  209.  
  210.     //vykreslenie jednej steny kocky
  211.     void center_cube_side(vec3 center, float size)
  212.     {
  213.         glBegin(GL_LINE_LOOP);
  214.         /*glVertex3f(center.x - size / 2, center.y - size / 2, center.z - size / 2);
  215.         glVertex3f(center.x + size / 2, center.y - size / 2, center.z - size / 2);
  216.         glVertex3f(center.x + size / 2, center.y + size / 2, center.z - size / 2);
  217.         glVertex3f(center.x - size / 2, center.y + size / 2, center.z - size / 2);*/
  218.  
  219.         glVertex3f(size, size, size);
  220.         glVertex3f(-size, size, size);
  221.         glVertex3f(-size, -size, size);
  222.         glVertex3f(size, -size, size);
  223.  
  224.         glEnd();
  225.     }
  226.  
  227.     //zoskupenie stien, aby tvorili kocku, vzdy sa vytvori stena,
  228.     //zrotuje o 90 stupnov okolo y osi a ide na rad dalsia
  229.     void center_cube(vec3 center, float size)
  230.     {
  231.         for (int i = 0; i < 4; i++)
  232.         {
  233.             glRotatef(90, 0, 1, 0);
  234.             center_cube_side(center, size);
  235.             if (i % 2 == 0) center_cube_side(center, 0.2);
  236.         }
  237.     }
  238.  
  239.     vec3 cam_pos, cam_dir, cam_up;
  240.     bool proj;
  241. };
  242.  
  243. Scene *sc = new Scene();
  244.  
  245. void kamera()
  246. {
  247.     gluLookAt(xx, yy, zz, 0, 0, 0, 0, 1, 0);
  248. }
  249.  
  250. void keyboard(unsigned char key, int x, int y)
  251. {
  252.     bool mode = false;
  253.     float smer = 0.05;
  254.  
  255.     if (key == 'a'){
  256.         if (mode == false && xx < 1.99 && zz < -0.01)
  257.         {
  258.             xx += 0.05;
  259.             zz += 0.05;
  260.         }
  261.         else mode = true;
  262.  
  263.         if (mode == true && xx > 0.01 && zz < 1.99)
  264.         {
  265.             xx -= 0.05;
  266.             zz += 0.05;
  267.         }
  268.         else mode = false;
  269.  
  270.         if (mode == false && xx > -1.99 && zz > 0.01)
  271.         {
  272.             xx -= 0.05;
  273.             zz -= 0.05;
  274.         }
  275.  
  276.         else mode = true;
  277.  
  278.         ///tu sam itreba vratit na xx == 0, zz == 2 a nejde to
  279.         if (mode == true && xx < -0.01 && zz > -1.99)
  280.         {
  281.             xx += 0.05;
  282.             zz -= 0.05;
  283.         }
  284.         else mode = false;
  285.  
  286.         //if (mode == true && )
  287.  
  288.         //else xx -= 0.05;
  289.         //if(zz < -0.01) zz += 0.05;
  290.         //else zz = -2;
  291.  
  292.         glLoadIdentity();
  293.         kamera();
  294.     }
  295.  
  296.     if (key == 'd'){
  297.         /*if (xx > -1.99)*/ //xx -= 0.05;
  298.         //else xx += 0.05;
  299.         /*if (zz < -0.01)*/ //zz += 0.05;
  300.         //else zz = -2;
  301.         //xx -= 0.05;
  302.         //zz += 0.05;
  303.  
  304.         if (/*mode == false &&*/ xx > -1.99 && zz < -0.01)
  305.         {
  306.             xx -= 0.05;
  307.             zz += 0.05;
  308.         }
  309.         else mode = true;
  310.  
  311.         if (mode == true && xx > 0.01 && zz < 1.99)
  312.         {
  313.             xx -= 0.05;
  314.             zz += 0.05;
  315.         }
  316.         else mode = false;
  317.  
  318.         if (mode == false && xx > -1.99 && zz > 0.01)
  319.         {
  320.             xx -= 0.05;
  321.             zz -= 0.05;
  322.         }
  323.  
  324.         else mode = true;
  325.  
  326.         ///tu sam itreba vratit na xx == 0, zz == 2 a nejde to
  327.         if (mode == true && xx < -0.01 && zz > -1.99)
  328.         {
  329.             xx += 0.05;
  330.             zz -= 0.05;
  331.         }
  332.         else mode = false;
  333.  
  334.  
  335.         glLoadIdentity();
  336.         kamera();
  337.  
  338.     }
  339.  
  340.     if (key == 'w'){
  341.         //yy += 0.05;
  342.         //zz += 0.05;
  343.  
  344.         if (mode == false && yy < 1.99 && zz < -0.01)
  345.         {
  346.             yy += 0.05;
  347.             zz += 0.05;
  348.         }
  349.         else mode = true;
  350.  
  351.         if (mode == true && yy < 3.99 && zz > -1.99)
  352.         {
  353.             yy += 0.05;
  354.             zz -= 0.05;
  355.         }
  356.         else mode = false;
  357.  
  358.         if (mode == false && yy > -1.99 && zz > 0.01)
  359.         {
  360.             yy -= 0.05;
  361.             zz -= 0.05;
  362.         }
  363.  
  364.         else mode = true;
  365.  
  366.         ///tu sa mi treba vratit na xx == 0, zz == 2 a nejde to
  367.         if (mode == true && yy < -0.01 && zz > -1.99)
  368.         {
  369.             yy += 0.05;
  370.             zz -= 0.05;
  371.         }
  372.         else mode = false;
  373.         glLoadIdentity();
  374.         kamera();
  375.     }
  376.  
  377.     if (key == 's'){
  378.         //yy -= 0.05;
  379.         //zz += 0.05;
  380.  
  381.         if (mode == false && yy < 1.99 && zz < -0.01)
  382.         {
  383.             yy -= 0.05;
  384.             zz += 0.05;
  385.         }
  386.         else mode = true;
  387.  
  388.         if (mode == true && yy > 0.01 && zz < 1.99)
  389.         {
  390.             yy -= 0.05;
  391.             zz += 0.05;
  392.         }
  393.         else mode = false;
  394.  
  395.         if (mode == false && yy > -1.99 && zz > 0.01)
  396.         {
  397.             yy -= 0.05;
  398.             zz -= 0.05;
  399.         }
  400.  
  401.         else mode = true;
  402.  
  403.         ///tu sa mi treba vratit na xx == 0, zz == 2 a nejde to
  404.         if (mode == true && yy < -0.01 && zz > -1.99)
  405.         {
  406.             yy += 0.05;
  407.             zz -= 0.05;
  408.         }
  409.         else mode = false;
  410.  
  411.         glLoadIdentity();
  412.         kamera();
  413.     }
  414.  
  415.     if (key == '1'){
  416.         camera_mode = 1;
  417.     }
  418.  
  419.     if (key == '0'){
  420.         camera_mode = 0;
  421.     }
  422. }
  423.  
  424. void init(void){
  425.     sc->setting_projection();
  426. }
  427.  
  428. void display(void){
  429.     sc->draw();
  430. }
  431.  
  432. void idle(void){
  433.     sc->draw();
  434.     if (camera_mode == 1)
  435.     {
  436.         glLoadIdentity();
  437.         sc->set_camera_ball();
  438.     }
  439.  
  440.     if (camera_mode == 0)
  441.     {
  442.         glLoadIdentity();
  443.         kamera();
  444.     }
  445. }
  446.  
  447. void onMouseMove(int x, int y) {
  448.  
  449.     angle1 = (360 * x - 180 * glutGet(GLUT_WINDOW_WIDTH)) / glutGet(GLUT_WINDOW_WIDTH);
  450.     angle2 = (360 * y - 180 * glutGet(GLUT_WINDOW_HEIGHT)) / glutGet(GLUT_WINDOW_HEIGHT);
  451.  
  452.     idle();
  453.  
  454. }
  455.  
  456. void main(int argc, char** argv)
  457. {
  458.     glutInit(&argc, argv);
  459.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
  460.     glutInitWindowSize(600, 600);
  461.     glutCreateWindow("Zadanie 1");
  462.  
  463.     glutDisplayFunc(display);
  464.     glutKeyboardFunc(keyboard);
  465.     glutPassiveMotionFunc(onMouseMove);
  466.     glutIdleFunc(idle); //ulohy alebo animacie prebiehaju dalej, aj ked nie su prijate ziadne udalosti
  467.     init();
  468.     glutMainLoop();
  469. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement