Changeset 5330


Ignore:
Timestamp:
May 15, 2008, 4:28:32 PM (17 years ago)
Author:
jack
Message:

AnugaVis?: Improved camera control. Added forwards/backwards motion.

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
    110#include <math.h>
    211#include "camera.h"
    312#include "globals.h"
     13#include "vector.h"
    414
    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];
     15static const vector up = {0.0, 0.0, 1.0};
     16#include <stdio.h>
     17void camera_pitch(float theta){
    818  float c = cos(theta);
    919  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);
    1450}
    1551
    16 void camera_rotate_pitch(float theta){
     52void 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}
    1763
     64void 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);
    1871}
  • anuga_work/development/anugavis/src/camera.h

    r5292 r5330  
    22#define CAMERA_H
    33
    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
    58
    6 void camera_rotate_yaw(float theta);
    7 void camera_rotate_pitch(float theta);
     9void camera_pitch(float theta);
     10void camera_yaw(float theta);
     11void camera_track(float dist);
    812
    913#endif
  • anuga_work/development/anugavis/src/events.c

    r5292 r5330  
    2929  glMatrixMode(GL_MODELVIEW);
    3030  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);
    3337  gluLookAt(anugavis.eye[0], anugavis.eye[1], anugavis.eye[2],
    3438            anugavis.focus[0], anugavis.focus[1], anugavis.focus[2],
     
    4246  /* TODO: Add support for moving the camera. */
    4347  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;
    5677        break;
    5778      case SDLK_DOWN:
    58         anugavis.eye[2] += 1;
     79        anugavis.keys[KEY_BACKWARD] = 0;
     80        anugavis.keys[KEY_PITCH_DOWN] = 0;
    5981        break;
    6082      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;
    7384        anugavis.keys[KEY_ROTATE_LEFT] = 0;
    7485        break;
    7586      case SDLK_RIGHT:
     87        anugavis.keys[KEY_STRAFE_RIGHT] = 0;
    7688        anugavis.keys[KEY_ROTATE_RIGHT] = 0;
    7789        break;
    78       default:
    79         break;
     90      default: break;
    8091      }
    81       break;
    82     }
    8392  return more;
    8493}
  • anuga_work/development/anugavis/src/events.h

    r5292 r5330  
    88              KEY_ROTATE_LEFT,
    99              KEY_ROTATE_RIGHT,
     10              KEY_PITCH_UP,
     11              KEY_PITCH_DOWN,
    1012              KEY_MAX} KEYS;
    1113
  • anuga_work/development/anugavis/src/globals.h

    r5292 r5330  
    3131  int *volumes;
    3232
     33  GLfloat pitch;
     34  GLfloat yaw;
     35  /* track is forward/back motion, strafe is side/side motion */
     36  GLfloat track;
     37  GLfloat strafe;
    3338  GLfloat eye[3];
    3439  GLfloat focus[3];
  • anuga_work/development/anugavis/src/init.c

    r5292 r5330  
    3232  anugavis.y = NULL;
    3333  anugavis.volumes = NULL;
     34
     35  anugavis.pitch = 0.0;
     36  anugavis.yaw = 0.0;
     37  anugavis.track = 0.0;
     38  anugavis.strafe = 0.0;
    3439  /* FIXME derive this from the dataset? */
    3540  anugavis.eye[0] = 1.0;
  • anuga_work/development/anugavis/src/vector.c

    r5292 r5330  
    22#include "vector.h"
    33
    4 float vlen(vector v){
     4void 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
     9float vlen(const vector v){
    510  return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
    611}
    712
    8 void vscale(vector v, float scale, vector result){
     13void vscale(const vector v, const float scale, vector result){
    914  int i;
    1015  for(i = 0 ; i < 3 ; i++) result[i] = scale * v[i];
    1116}
    1217
    13 void vsub(vector v1, vector v2, vector result){
     18void vsub(const vector v1, const vector v2, vector result){
    1419  int i;
    1520  for(i = 0 ; i < 3 ; i++) result[i] = v1[i] - v2[i];
    1621}
    1722
    18 float vdot(vector v1, vector v2){
     23float vdot(const vector v1, const vector v2){
    1924  int i;
    2025  float rv = 0;
     
    2328}
    2429
    25 void vcross(vector v1, vector v2, vector result){
     30void vcross(const vector v1, const vector v2, vector result){
    2631  result[0] = v1[1] * v2[2] - v1[2] * v2[1];
    2732  result[1] = v1[2] * v2[0] - v1[0] * v2[2];
  • anuga_work/development/anugavis/src/vector.h

    r5292 r5330  
    44typedef float vector[3];
    55/* 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);
     6void vadd(const vector v1, const vector v2, vector result);
     7float vlen(const vector v);
     8void vscale(const vector v, const float scale, vector result);
     9void vsub(const vector v1, const vector v2, vector result);
     10float vdot(const vector v1, const vector v2);
     11void vcross(const vector v1, const vector v2, vector result);
    1112
    1213#endif
Note: See TracChangeset for help on using the changeset viewer.