All pastes #988244 Raw Edit

openGL great circle

public cpp v1 · immutable
#988244 ·published 2008-04-17 12:29 UTC
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;};