Changeset 5330
- Timestamp:
- May 15, 2008, 4:28:32 PM (17 years ago)
- Location:
- anuga_work/development/anugavis/src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
anuga_work/development/anugavis/src/camera.c
r5292 r5330 1 #ifdef HAVE_CONFIG_H 2 # include "config.h" 3 #endif 4 5 #ifdef HAVE_GL_GL_H 6 # include <GL/gl.h> 7 #elif HAVE_OPENGL_GL_H 8 # include <OpenGL/gl.h> 9 #endif 1 10 #include <math.h> 2 11 #include "camera.h" 3 12 #include "globals.h" 13 #include "vector.h" 4 14 5 void camera_rotate_yaw(float theta){ 6 float x = anugavis.eye[0] - anugavis.focus[0]; 7 float y = anugavis.eye[1] - anugavis.focus[1]; 15 static const vector up = {0.0, 0.0, 1.0}; 16 #include <stdio.h> 17 void camera_pitch(float theta){ 8 18 float c = cos(theta); 9 19 float s = sin(theta); 10 float newx = c * x + s * y; 11 float newy = -1 * s * x + c * y; 12 anugavis.eye[0] = newx; 13 anugavis.eye[1] = newy; 20 float x; 21 float y; 22 float z; 23 vector releye; 24 vector newreleye; 25 vector axis; 26 float dot; 27 float len; 28 vsub(anugavis.eye, anugavis.focus, releye); 29 /* Check we're not too near the vertical */ 30 dot = vdot(up, releye); len = vlen(releye); 31 if(((dot > 0.99 * len) && (theta > 0)) || 32 ((dot < -0.99 * len) && (theta < 0))) return; 33 /* Calculation from glRotatef manpage. */ 34 vcross(releye, up, axis); 35 vscale(axis, 1.0/vlen(axis), axis); 36 x = axis[0]; y = axis[1]; z = axis[2]; 37 newreleye[0] = 38 releye[0] * (x*x*(1-c)+c) + 39 releye[1] * (x*y*(1-c)-z*s) + 40 releye[2] * (x*z*(1-c)+y*s); 41 newreleye[1] = 42 releye[0] * (y*x*(1-c)+z*s) + 43 releye[1] * (y*y*(1-c)+c) + 44 releye[2] * (y*z*(1-c)-x*s); 45 newreleye[2] = 46 releye[0] * (z*x*(1-c)-y*s) + 47 releye[1] * (z*y*(1-c)+x*s) + 48 releye[2] * (z*z*(1-c)+c); 49 vadd(newreleye, anugavis.focus, anugavis.eye); 14 50 } 15 51 16 void camera_rotate_pitch(float theta){ 52 void camera_yaw(float theta){ 53 float c = cos(theta); 54 float s = sin(theta); 55 vector releye; 56 vector newreleye; 57 vsub(anugavis.eye, anugavis.focus, releye); 58 newreleye[0] = releye[0] * c + releye[1] * s; 59 newreleye[1] = releye[0] * -1 * s + releye[1] * c; 60 newreleye[2] = releye[2]; 61 vadd(newreleye, anugavis.focus, anugavis.eye); 62 } 17 63 64 void camera_track(float dist){ 65 vector dir = {0, 0, 0}; 66 vsub(anugavis.eye, anugavis.focus, dir); 67 dir[2] = 0; 68 vscale(dir, dist/vlen(dir), dir); 69 vadd(anugavis.eye, dir, anugavis.eye); 70 vadd(anugavis.focus, dir, anugavis.focus); 18 71 } -
anuga_work/development/anugavis/src/camera.h
r5292 r5330 2 2 #define CAMERA_H 3 3 4 #define CAMERA_DEFAULT_THETA 0.1 4 #define CAMERA_YAW_STEP 0.1 5 #define CAMERA_PITCH_STEP 0.1 6 #define CAMERA_TRACK_STEP 1.0 7 #define CAMERA_STRAFE_STEP 0.1 5 8 6 void camera_rotate_yaw(float theta); 7 void camera_rotate_pitch(float theta); 9 void camera_pitch(float theta); 10 void camera_yaw(float theta); 11 void camera_track(float dist); 8 12 9 13 #endif -
anuga_work/development/anugavis/src/events.c
r5292 r5330 29 29 glMatrixMode(GL_MODELVIEW); 30 30 glLoadIdentity(); 31 if(anugavis.keys[KEY_ROTATE_LEFT]) camera_rotate_yaw(CAMERA_DEFAULT_THETA); 32 if(anugavis.keys[KEY_ROTATE_RIGHT]) camera_rotate_yaw(-CAMERA_DEFAULT_THETA); 31 if(anugavis.keys[KEY_ROTATE_LEFT]) camera_yaw(-CAMERA_YAW_STEP); 32 if(anugavis.keys[KEY_ROTATE_RIGHT]) camera_yaw(CAMERA_YAW_STEP); 33 if(anugavis.keys[KEY_PITCH_UP]) camera_pitch(CAMERA_PITCH_STEP); 34 if(anugavis.keys[KEY_PITCH_DOWN]) camera_pitch(-CAMERA_PITCH_STEP); 35 if(anugavis.keys[KEY_FORWARD]) camera_track(-CAMERA_TRACK_STEP); 36 if(anugavis.keys[KEY_BACKWARD]) camera_track(CAMERA_TRACK_STEP); 33 37 gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2], 34 38 anugavis.focus[0], anugavis.focus[1], anugavis.focus[2], … … 42 46 /* TODO: Add support for moving the camera. */ 43 47 while(SDL_PollEvent(&event)) 44 switch(event.type){ 45 case SDL_KEYDOWN: 46 switch(event.key.keysym.sym){ 47 case SDLK_b: 48 if(anugavis.current_frame > 0) anugavis.current_frame--; 49 break; 50 case SDLK_f: 51 if(anugavis.current_frame < anugavis.number_of_timesteps - 1) 52 anugavis.current_frame++; 53 break; 54 case SDLK_ESCAPE: 55 more = 0; 48 if(event.type == SDL_QUIT) more = 0; 49 else if(event.type == SDL_KEYDOWN) 50 if(event.key.keysym.mod & (KMOD_LALT | KMOD_RALT)) 51 switch(event.key.keysym.sym){ 52 case SDLK_UP: anugavis.keys[KEY_FORWARD] = 1; break; 53 case SDLK_DOWN: anugavis.keys[KEY_BACKWARD] = 1; break; 54 case SDLK_LEFT: anugavis.keys[KEY_STRAFE_LEFT] = 1; break; 55 case SDLK_RIGHT: anugavis.keys[KEY_STRAFE_RIGHT] = 1; break; 56 default: break; 57 } 58 else switch(event.key.keysym.sym){ 59 case SDLK_b: 60 if(anugavis.current_frame > 0) anugavis.current_frame--; 61 break; 62 case SDLK_f: 63 if(anugavis.current_frame < anugavis.number_of_timesteps - 1) 64 anugavis.current_frame++; 65 break; 66 case SDLK_ESCAPE: more = 0; break; 67 case SDLK_UP: anugavis.keys[KEY_PITCH_UP] = 1; break; 68 case SDLK_DOWN: anugavis.keys[KEY_PITCH_DOWN] = 1; break; 69 case SDLK_LEFT: anugavis.keys[KEY_ROTATE_LEFT] = 1; break; 70 case SDLK_RIGHT: anugavis.keys[KEY_ROTATE_RIGHT] = 1; break; 71 default: break; 72 } 73 else switch(event.key.keysym.sym){ 74 case SDLK_UP: 75 anugavis.keys[KEY_FORWARD] = 0; 76 anugavis.keys[KEY_PITCH_UP] = 0; 56 77 break; 57 78 case SDLK_DOWN: 58 anugavis.eye[2] += 1; 79 anugavis.keys[KEY_BACKWARD] = 0; 80 anugavis.keys[KEY_PITCH_DOWN] = 0; 59 81 break; 60 82 case SDLK_LEFT: 61 anugavis.keys[KEY_ROTATE_LEFT] = 1; 62 break; 63 case SDLK_RIGHT: 64 anugavis.keys[KEY_ROTATE_RIGHT] = 1; 65 break; 66 default: 67 break; 68 } 69 break; 70 case SDL_KEYUP: 71 switch(event.key.keysym.sym){ 72 case SDLK_LEFT: 83 anugavis.keys[KEY_STRAFE_LEFT] = 0; 73 84 anugavis.keys[KEY_ROTATE_LEFT] = 0; 74 85 break; 75 86 case SDLK_RIGHT: 87 anugavis.keys[KEY_STRAFE_RIGHT] = 0; 76 88 anugavis.keys[KEY_ROTATE_RIGHT] = 0; 77 89 break; 78 default: 79 break; 90 default: break; 80 91 } 81 break;82 }83 92 return more; 84 93 } -
anuga_work/development/anugavis/src/events.h
r5292 r5330 8 8 KEY_ROTATE_LEFT, 9 9 KEY_ROTATE_RIGHT, 10 KEY_PITCH_UP, 11 KEY_PITCH_DOWN, 10 12 KEY_MAX} KEYS; 11 13 -
anuga_work/development/anugavis/src/globals.h
r5292 r5330 31 31 int *volumes; 32 32 33 GLfloat pitch; 34 GLfloat yaw; 35 /* track is forward/back motion, strafe is side/side motion */ 36 GLfloat track; 37 GLfloat strafe; 33 38 GLfloat eye[3]; 34 39 GLfloat focus[3]; -
anuga_work/development/anugavis/src/init.c
r5292 r5330 32 32 anugavis.y = NULL; 33 33 anugavis.volumes = NULL; 34 35 anugavis.pitch = 0.0; 36 anugavis.yaw = 0.0; 37 anugavis.track = 0.0; 38 anugavis.strafe = 0.0; 34 39 /* FIXME derive this from the dataset? */ 35 40 anugavis.eye[0] = 1.0; -
anuga_work/development/anugavis/src/vector.c
r5292 r5330 2 2 #include "vector.h" 3 3 4 float vlen(vector v){ 4 void vadd(const vector v1, const vector v2, vector result){ 5 int i; 6 for(i = 0 ; i < 3 ; i++) result[i] = v1[i] + v2[i]; 7 } 8 9 float vlen(const vector v){ 5 10 return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); 6 11 } 7 12 8 void vscale( vector v,float scale, vector result){13 void vscale(const vector v, const float scale, vector result){ 9 14 int i; 10 15 for(i = 0 ; i < 3 ; i++) result[i] = scale * v[i]; 11 16 } 12 17 13 void vsub( vector v1,vector v2, vector result){18 void vsub(const vector v1, const vector v2, vector result){ 14 19 int i; 15 20 for(i = 0 ; i < 3 ; i++) result[i] = v1[i] - v2[i]; 16 21 } 17 22 18 float vdot( vector v1,vector v2){23 float vdot(const vector v1, const vector v2){ 19 24 int i; 20 25 float rv = 0; … … 23 28 } 24 29 25 void vcross( vector v1,vector v2, vector result){30 void vcross(const vector v1, const vector v2, vector result){ 26 31 result[0] = v1[1] * v2[2] - v1[2] * v2[1]; 27 32 result[1] = v1[2] * v2[0] - v1[0] * v2[2]; -
anuga_work/development/anugavis/src/vector.h
r5292 r5330 4 4 typedef float vector[3]; 5 5 /* Useful vector operations. */ 6 float vlen(vector v); 7 void vscale(vector v, float scale, vector result); 8 void vsub(vector v1, vector v2, vector result); 9 float vdot(vector v1, vector v2); 10 void vcross(vector v1, vector v2, vector result); 6 void vadd(const vector v1, const vector v2, vector result); 7 float vlen(const vector v); 8 void vscale(const vector v, const float scale, vector result); 9 void vsub(const vector v1, const vector v2, vector result); 10 float vdot(const vector v1, const vector v2); 11 void vcross(const vector v1, const vector v2, vector result); 11 12 12 13 #endif
Note: See TracChangeset
for help on using the changeset viewer.