rendered paste body#include <iostream>#include <SDL/SDL.h>#include <SDL/SDL_opengl.h>#include <cmath>using namespace std;typedef struct { double x,y,z;} XYZ;XYZ Normalise(XYZ *v) { double d = sqrt(v->x*v->x+v->y*v->y+v->z*v->z); v->x /= d; v->y /= d; v->z /= d; return *v;}/* Rotate a point p by angle theta around an arbitrary axis r Return the rotated point. Positive angles are anticlockwise looking down the axis towards the origin. Assume right hand coordinate system.*/XYZ ArbitraryRotate(XYZ p,double theta,XYZ r){ XYZ q = {0.0,0.0,0.0}; double costheta,sintheta; Normalise(&r); costheta = cos(theta); sintheta = sin(theta); q.x += (costheta + (1 - costheta) * r.x * r.x) * p.x; q.x += ((1 - costheta) * r.x * r.y - r.z * sintheta) * p.y; q.x += ((1 - costheta) * r.x * r.z + r.y * sintheta) * p.z; q.y += ((1 - costheta) * r.x * r.y + r.z * sintheta) * p.x; q.y += (costheta + (1 - costheta) * r.y * r.y) * p.y; q.y += ((1 - costheta) * r.y * r.z - r.x * sintheta) * p.z; q.z += ((1 - costheta) * r.x * r.z - r.y * sintheta) * p.x; q.z += ((1 - costheta) * r.y * r.z + r.x * sintheta) * p.y; q.z += (costheta + (1 - costheta) * r.z * r.z) * p.z; return q;}int main (){ if(SDL_Init(SDL_INIT_EVERYTHING))return 0; atexit(SDL_Quit); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); int width=800; int height=600; SDL_SetVideoMode(width, height, 16, SDL_OPENGL); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f, (float)width/(float)height, 1.0f, 1000.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); XYZ kamera={3,0,0}; gluLookAt(kamera.x,kamera.y,kamera.z,0,0,0,0,1,0); SDL_Event event; float kat=-0.002; bool done=0; XYZ os1={0,1,0}; XYZ os2={0,0,-1}; XYZ gora; while(!done){ SDL_PollEvent(&event); if(event.key.keysym.sym == SDLK_ESCAPE||event.type==SDL_QUIT){ done=1; break; } if(event.type==SDL_KEYDOWN){ if(event.key.keysym.sym==SDLK_LEFT||event.key.keysym.sym==SDLK_a) { kamera=ArbitraryRotate(kamera,kat,os1); os2=ArbitraryRotate(os2,kat,os1); glLoadIdentity(); gluLookAt(kamera.x,kamera.y,kamera.z,0,0,0,os1.x,os1.y,os1.z); } if(event.key.keysym.sym==SDLK_RIGHT||event.key.keysym.sym==SDLK_d) { kamera=ArbitraryRotate(kamera,-kat,os1); os2=ArbitraryRotate(os2,-kat,os1); glLoadIdentity(); gluLookAt(kamera.x,kamera.y,kamera.z,0,0,0,os1.x,os1.y,os1.z); } if(event.key.keysym.sym==SDLK_UP||event.key.keysym.sym==SDLK_s) { kamera=ArbitraryRotate(kamera,kat,os2); os1=ArbitraryRotate(os1,kat,os2); glLoadIdentity(); gluLookAt(kamera.x,kamera.y,kamera.z,0,0,0,os1.x,os1.y,os1.z); } if(event.key.keysym.sym==SDLK_DOWN||event.key.keysym.sym==SDLK_w) { kamera=ArbitraryRotate(kamera,-kat,os2); os1=ArbitraryRotate(os1,-kat,os2); glLoadIdentity(); gluLookAt(kamera.x,kamera.y,kamera.z,0,0,0,os1.x,os1.y,os1.z); } } glPushMatrix(); for (int i = 0; i < 6; i++) { glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glEnd(); if (i % 2 == 0) glRotatef(90.0f, 1.0f, 0.0f, 0.0f); else glRotatef(90.0f, 0.0f, 1.0f, 0.0f); } glPopMatrix(); SDL_GL_SwapBuffers(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } SDL_Quit(); return 0;};